我有一个2darray
,对于每一行,我想计算col average
中行numbers
的相同键(在这种情况下,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
根据[1]和[2]中的建议,我知道grouby
中有pandas
等聚合方法,但groupby
方法会提供唯一的聚合,而我打算将它们投射到每一行。
我目前的工作流程如下:
groupby('foo').mean()
key
映射到聚合。例如:
>>> 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。
因此,如果有人可以分享任何建议,我会很高兴。谢谢!
答案 0 :(得分:1)
我认为两列都需要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')