在数据帧中对一列求和,同时保留其他列

2024-10-03 04:25:58 发布

您现在位置:Python中文网/ 问答频道 /正文

在熊猫数据帧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列,而保留其他列?你知道吗


Tags: namefrominfodfamountkeywordpotatosum
2条回答

对自定义aggfunc dict使用^{}+^{}

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个列。如果列顺序很重要,请在末尾添加^{}操作:

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

按列KEYWORD使用^{},然后^{}聚合值:

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

相关问题 更多 >