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

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

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

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]
因此,预期结果是一个数组:

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

yeotifhr1#

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

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

输出量:

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

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

goqiplq2

goqiplq22#

充分利用numpy

import numpy as np

out = (df.groupby('group')['vector']
         .agg(lambda x: np.vstack(x).mean(0).round(2))
       )

print(out)

输出量:

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

输出量:

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

输出量:

[[3.33 2.67 0.67 0.67]
 [3.   4.   1.   2.  ]
 [6.   2.   0.   0.  ]]

相关问题