我有一个2darray,对于每一行,我想针对同一键(在本例中为averagenumbers)在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/

10-16 08:18