pandas 计算python中定义组的每个维度的平均值

qjp7pelc  于 2022-11-20  发布在  Python
关注(0)|答案(2)|浏览(220)

我有一个 Dataframe (df),它有三列(user、vector和group name),vector列的每行有多个逗号分隔的值。

  1. df = pd.DataFrame({'user': ['user_1', 'user_2', 'user_3', 'user_4', 'user_5', 'user_6'], 'vector': [[1, 0, 2, 0], [1, 8, 0, 2],[6, 2, 0, 0], [5, 0, 2, 2], [3, 8, 0, 0],[6, 0, 0, 2]], 'group': ['A', 'B', 'C', 'B', 'A', 'A']})

我想计算每个组的所有行中的尺寸总和除以该组的总行数。
例如:对于群,A是[(1+3+6)/3, (0+8+0)/3, (2+0+0)/3, (0+0+2)/3] = [3.3, 2.6, 0.6, 0.6]

对于组,B为[(1+5)/2, (8+0)/2, (0+2)/2, (2+2)/2] = [3,4,1,2].
对于组,C为[6, 2, 0, 0]
因此,预期结果是一个数组:

  1. group A: [3.3, 2.6, 0.6, 0.6]
  2. group B: [3,4,1,2]
  3. group C: [6, 2, 0, 0]
yeotifhr

yeotifhr1#

我不确定您是在寻找存储在单个数组/ Dataframe 中的结果,还是只是在寻找作为单独数组的结果。
如果是后者,应该可以使用以下方法:

  1. for group in df.group.unique():
  2. print(f'Group {group} results: ')
  3. tmp_df = pd.DataFrame(df[df.group==group]['vector'].tolist())
  4. print(tmp_df.mean().values)

输出量:

  1. Group A results:
  2. [3.33333333 2.66666667 0.66666667 0.66666667]
  3. Group B results:
  4. [3. 4. 1. 2.]
  5. Group C results:
  6. [6. 2. 0. 0.]

这是一个有点笨重,但得到的工作完成,如果你只是想得到的结果。
基于组过滤 Dataframe ,然后将其向量转换为自己的tmp_df,并获取每列的平均值。
如果你愿意,你可以很容易地把这些数组,并保存他们为进一步的操作或什么你有。
希望这对你有帮助!

展开查看全部
goqiplq2

goqiplq22#

充分利用numpy

  1. import numpy as np
  2. out = (df.groupby('group')['vector']
  3. .agg(lambda x: np.vstack(x).mean(0).round(2))
  4. )
  5. print(out)

输出量:

  1. group
  2. A [3.33, 2.67, 0.67, 0.67]
  3. B [3.0, 4.0, 1.0, 2.0]
  4. C [6.0, 2.0, 0.0, 0.0]
  5. Name: vector, dtype: object
作为 Dataframe
  1. out = (df.groupby('group', as_index=False)['vector']
  2. .agg(lambda x: np.vstack(x).mean(0).round(2))
  3. )

输出量:

  1. group vector
  2. 0 A [3.33, 2.67, 0.67, 0.67]
  3. 1 B [3.0, 4.0, 1.0, 2.0]
  4. 2 C [6.0, 2.0, 0.0, 0.0]
作为数组
  1. out = np.vstack(df.groupby('group')['vector']
  2. .agg(lambda x: np.vstack(x).mean(0).round(2))
  3. )

输出量:

  1. [[3.33 2.67 0.67 0.67]
  2. [3. 4. 1. 2. ]
  3. [6. 2. 0. 0. ]]
展开查看全部

相关问题