【问题标题】:Pandas groupby + transform and multiple columns熊猫 groupby + 变换和多列
【发布时间】:2019-04-12 05:48:27
【问题描述】:

为了获得在 groupby-data 上执行的结果,其细节级别与原始 DataFrame 相同(观察计数相同),我使用了 transform 函数。

示例: 原始数据框

name, year, grade
Jack, 2010, 6
Jack, 2011, 7
Rosie, 2010, 7
Rosie, 2011, 8

分组变换后

name, year, grade, average grade
Jack, 2010, 6, 6.5
Jack, 2011, 7, 6.5
Rosie, 2010, 7, 7.5
Rosie, 2011, 8, 7.5

但是,对于基于多列的更高级功能,事情变得更加复杂。令我困惑的是,我似乎无法访问 groupby-transform 组合中的多个列。

df = pd.DataFrame({'a':[1,2,3,4,5,6],
               'b':[1,2,3,4,5,6],
               'c':['q', 'q', 'q', 'q', 'w', 'w'],  
               'd':['z','z','z','o','o','o']})

def f(x):
 y=sum(x['a'])+sum(x['b'])
 return(y)

df['e'] = df.groupby(['c','d']).transform(f)

给我:

KeyError: ('a', 'occurred at index a')

虽然我知道以下确实有效:

df.groupby(['c','d']).apply(f)

是什么导致了这种行为,我怎样才能得到这样的东西:

a   b   c   d   e
1   1   q   z   12
2   2   q   z   12
3   3   q   z   12
4   4   q   o   8
5   5   w   o   22
6   6   w   o   22

【问题讨论】:

  • 看看这个answer它可能会帮助你理解为什么
  • 我观察到通过在函数 f 中使用 print(x),列变成了标量。但是我该如何克服呢?

标签: python pandas pandas-groupby


【解决方案1】:

对于这种特殊情况,您可以这样做:

g = df.groupby(['c', 'd'])

df['e'] = g.a.transform('sum') + g.b.transform('sum')

df
# outputs

   a  b  c  d   e
0  1  1  q  z  12
1  2  2  q  z  12
2  3  3  q  z  12
3  4  4  q  o   8
4  5  5  w  o  22
5  6  6  w  o  22

如果您可以通过对同一 groupby 的独立变换进行线性组合来构造最终结果,则此方法将有效。

否则,您将使用 groupby-apply,然后合并回原始 df。

示例:

_ = df.groupby(['c','d']).apply(lambda x: sum(x.a+x.b)).rename('e').reset_index()
df.merge(_, on=['c','d'])
# same output as above.

【讨论】:

  • 刚刚意识到我已经使用合并发布了完全相同的替代解决方案:)
  • 由于某种原因重命名会导致 items = [func(x) for x in index] TypeError: 'str' object is not callable.
  • 一般来说,你应该避免在 Pandas 系列/NumPy 数组中使用内置函数。事实上,使用字符串 'sum' 而不是 sum 会被 Pandas 路由到一个经过验证的方法,你应该能够依赖它。
【解决方案2】:

您可以使用GroupBy + transformsum 两次:

df['e'] = df.groupby(['c', 'd'])[['a', 'b']].transform('sum').sum(1)

print(df)

   a  b  c  d   e
0  1  1  q  z  12
1  2  2  q  z  12
2  3  3  q  z  12
3  4  4  q  o   8
4  5  5  w  o  22
5  6  6  w  o  22

【讨论】:

    猜你喜欢
    • 2018-05-15
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2013-10-24
    相关资源
    最近更新 更多