我有以下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
我想按year
和code
groupby
df
,然后求和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/