我有一个2darray
,对于每一行,我想计算同一键的列数字
中的行平均值
(在此案例,key1
& key2
。这是我的问题的简单表示,下面是期望的结果:
>>> df
Out[3]:
key1 key2 number
0 a c 100
1 b d 200
2 a a 150
3 a a 200
>>> res
100
200
175 # (150+200)/2
175 # (150+200)/2
我知道pandas
中有诸如grouby
之类的聚合方法,按照[1]中的建议和 [2] ,但 groupby
方法将提供唯一的聚合,而我打算将它们转换到每一行。
我当前的工作流程如下:
- 使用
groupby('foo').mean()
获取聚合 - 然后,对于每一行,将行的
键
映射到聚合。
例如:
>>> K = df.key1 + df.key2
>>> K
Out[4]:
0 ac
1 bd
2 aa
3 aa
dtype: object
>>> agg = df2.groupby(K).mean()
>>> agg
Out[5]:
number
aa 175
ac 100
bd 200
>>> avgif = []
... agg = agg.squeeze() # groupby results shape in (n, 1)
... for k in K:
... avgif.append(agg.at[K])
>>> avgif
Out[6]:
[100, 200, 175, 175]
这工作正常,但我真正的问题是行可能非常多,可能高达 200k。
因此,如果有人能分享任何建议,我会很高兴。谢谢!
最佳答案
我认为需要GroupBy.transform
按两列:
df['new'] = df.groupby(['key1','key2'])['number'].transform('mean')
print (df)
key1 key2 number new
0 a c 100 100
1 b d 200 200
2 a a 150 175
3 a a 200 175
工作也改变了您的解决方案,但建议在 _
之间使用分隔符:
K = df.key1 + '_' + df.key2
df['new'] = df.groupby(K)['number'].transform('mean')
关于Python 按元素 AVERAGEIF 相当于 Excel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50501160/