python - pandas groupby 总结两列之间的差异并获得每组的平均值

标签 python python-3.x pandas dataframe group-by

我有以下df,

year    code    col1   col2
2019    1       2      3
2019    1       3      5
2019    1       2      4
2018    2       1      4
2018    2       2      6

我想按yearcodegroupbydf,然后求和col2之间的差异col1,然后对组大小的总和进行平均;

df.apply(lambda row: (row['col_2'] - row['col_1']).mean(level=[0, 1]).reset_index(name='avg_num')

这段代码似乎计算了差异的平均值,而不是对差异求和并除以组大小,那么如何解决这个问题呢?

year    code    col1   col2    avg_num
2019    1       2      3       1.66
2019    1       3      5       1.66
2019    1       2      4       1.66
2018    2       1      4       3.5
2018    2       2      6       3.5

最佳答案

使用GroupBy.transform对于由聚合值填充的新列:

df['avg_num'] = (df.assign(avg_num=df.col2 - df.col1)
                   .groupby(['year', 'code'])['avg_num']
                   .transform('mean').round(2))
print (df)
   year  code  col1  col2  avg_num
0  2019     1     2     3     1.67
1  2019     1     3     5     1.67
2  2019     1     2     4     1.67
3  2018     2     1     4     3.50
4  2018     2     2     6     3.50

另一种解决方案没有assign,但必须将列传递给groupby,例如df['year']df['code ']:

df['avg_num'] = ((df['col2'] - df['col1']).groupby([df['year'], df['code']])
                                          .transform('mean').round(2))
print (df)
   year  code  col1  col2  avg_num
0  2019     1     2     3     1.67
1  2019     1     3     5     1.67
2  2019     1     2     4     1.67
3  2018     2     1     4     3.50
4  2018     2     2     6     3.50

关于python - pandas groupby 总结两列之间的差异并获得每组的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56666517/

相关文章:

python - Tornado 的环境信息

python-3.x - 数据流作业卡在从 Pub/Sub 读取

string - python pandas 获取数据框中与两个精确字符串匹配的行的平均值

python - 如何从 numpy 数组创建数据框?

python - 在Django中, `session_key`是否是 `session id`?

python - 如何控制 tensorflow 中的维度广播?

python - 如何将一个添加到矩阵?

python - 如何让 Tkinter 事件监听器工作?

python - 只打印字符串的内容

python - 如何管理 pandas 数据框中的特殊字符\r