在一列上汇总数据框,同时保留其他列

Posted

技术标签:

【中文标题】在一列上汇总数据框,同时保留其他列【英文标题】: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 函数。你可以通过传递一个字符串来调用它。 【参考方案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 上正常播放。

以上是关于在一列上汇总数据框,同时保留其他列的主要内容,如果未能解决你的问题,请参考以下文章

熊猫合并:合并同一列上的两个数据框,但保留不同的列

在一列上排名表,同时在另一列上排序

Pandas:如何通过保留第一个数据框的信息来合并列上的两个数据框?

是否可以 unlist() 嵌套数据框,同时保留 data.frame 中的其他列?

SQL Server 旋转一列并保留其他列

如何在保留列表名称和值的同时展平一列列表? [r] [重复]