我有一个2darray
,对于每一行,我想针对同一键(在本例中为average
和numbers
)在col 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。
因此,如果有人可以分享任何建议,我很乐意。谢谢!
最佳答案
我认为两栏都需要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 - 相当于Excel的Python Element-wise AVERAGEIF,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50501160/