在一列上汇总数据框,同时保留其他列
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:如何通过保留第一个数据框的信息来合并列上的两个数据框?