Python元素级AVERAGEIF等同于Excel

时间:2018-05-24 04:46:22

标签: python pandas aggregate

我有一个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方法会提供唯一的聚合,而我打算将它们投射到每一行。

我目前的工作流程如下:

  1. 使用groupby('foo').mean()
  2. 获取聚合
  3. 然后,对于每一行,将行的key映射到聚合。
  4. 例如:

    >>> 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。

    因此,如果有人可以分享任何建议,我会很高兴。谢谢!

1 个答案:

答案 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')