【问题标题】:Summing in a Dataframe over one column while keeping others在一列上汇总数据框,同时保留其他列
【发布时间】:2018-07-23 11:53:59
【问题描述】:

在 pandas Dataframe df 我有这样的列:

    NAME    KEYWORD  AMOUNT  INFO
0   orange  fruit    13      from italy
1   potato  veggie   7       from germany
2   potato  veggie   9       from germany
3   orange  fruit    8       from italy
4   potato  veggie   6       from germany

执行groupby KEYWORD 操作我想构建每组AMOUNT 值的总和并始终从其他列中保留第一个值,因此结果显示为:

    NAME    KEYWORD  AMOUNT  INFO
0   orange  fruit    21      from italy
1   potato  veggie   22      from germany

我试过了

df.groupby('KEYWORD).sum()

但这“总结”了所有列,即我得到

    NAME                KEYWORD  AMOUNT  INFO
0   orangeorange        fruit    21      from italyfrom italy
1   potatopotatopotato  veggie   22      from germanyfrom germanyfrom germany

然后我尝试对不同的列使用不同的函数:

df.groupby('KEYWORD).agg({'AMOUNT': sum, 'NAME': first, ....})

def first(f_arg, *args):
    return f_arg

但不幸的是,这给了我一个“ValueError: function does not reduce”错误。

所以我有点不知所措。如何将sum 仅应用于AMOUNT 列,同时保留其他列?

【问题讨论】:

  • pandas 有一个内置的first 函数。你可以通过传递一个字符串来调用它。

标签: python pandas group-by sum


【解决方案1】:

按列使用drop_duplicates KEYWORD,然后使用assign 聚合值:

df=df.drop_duplicates('KEYWORD').assign(AMOUNT=df.groupby('KEYWORD')['AMOUNT'].sum().values)
print (df)
     NAME KEYWORD  AMOUNT          INFO
0  orange   fruit      21    from italy
1  potato  veggie      22  from germany

【讨论】:

    【解决方案2】:

    使用 groupby + agg 和自定义 aggfunc 字典。

    f = dict.fromkeys(df.columns.difference(['KEYWORD']), 'first')
    f['AMOUNT'] = sum
    
    df = df.groupby('KEYWORD', as_index=False).agg(f)
    df
    
      KEYWORD    NAME  AMOUNT          INFO
    0   fruit  orange      21    from italy
    1  veggie  potato      22  from germany
    

    dict.fromkeys 给了我一个很好的方法来概括 N 列。如果列顺序很重要,请在末尾添加 reindex 操作:

    df = df.groupby('KEYWORD', as_index=False).agg(f).reindex(columns=df.columns)
    df
    
         NAME KEYWORD  AMOUNT          INFO
    0  orange   fruit      21    from italy
    1  potato  veggie      22  from germany
    

    【讨论】:

    • 谢谢大家,@COLDSPEED。所以我很接近。 :-) 我仍然不明白为什么聚合函数在作为字符串'first' 提供时起作用,而正确的函数引用first 不起作用。我对first 的定义错了吗?我不明白为什么:它确实将许多参数转换为第一个参数类型的一个值。这就是聚合的作用,对吧?
    • @halloleo 你肯定很接近。但我不认为你的功能是正确的。如果我没记错的话,它应该接受一个系列并将第一行作为另一个数组/系列返回。
    • @COLDSPEED 感谢您的回复。 - 是的,我的函数无法在 pandas 上正常播放。
    猜你喜欢
    • 1970-01-01
    • 2016-12-29
    • 2022-07-21
    • 2019-11-18
    • 2019-04-28
    • 1970-01-01
    • 2021-03-28
    • 2022-11-23
    • 1970-01-01
    相关资源
    最近更新 更多