Pandas重复属性的总和

时间:2015-04-11 21:33:48

标签: python csv pandas

我正在使用Pandas来操作一个csv文件,其中有几行和几列,如下所示

Fullname     Amount     Date           Zip    State .....
John Joe        1        1/10/1900     55555    Confusion
Betty White     5         .             .       Alaska 
Bruce Wayne     10        .             .       Frustration
John Joe        20        .             .       .
Betty White     25        .             .       .

我想创建一个名为" Total"每个人的总金额。 (由fullname和zip标识)。我很难找到正确的解决方案。

让我们调用我的csv import csvfile。这就是我所拥有的。

import Pandas
df = pandas.read_csv('csvfile.csv', header = 0) 
df.sort(['fullname'])

我想我必须使用iterrows来做我想要的对象。丢弃重复的问题是我将丢失金额或金额可能不同。

2 个答案:

答案 0 :(得分:22)

我想你想要这个:

df['Total'] = df.groupby(['Fullname', 'Zip'])['Amount'].transform('sum')

因此,groupby将按照Fullnamezip列进行分组,如您所述,我们会在Amount列上调用transform并计算传入字符串sum的总金额,这将返回一个索引与原始df对齐的系列,然后您可以删除重复项。 e.g。

new_df = df.drop_duplicates(subset=['Fullname', 'Zip'])

答案 1 :(得分:1)

考虑使用以下之一

df = df.groupby(['Fullname', 'Zip'], as_index=False)['Amount'].sum()
df = df.groupby(['Fullname', 'Zip'], as_index=False)['Amount'].cumsum()
df = df.groupby(['Fullname', 'Zip'], as_index=False)['Amount'].agg('sum')

所有三种方法都将结果存储在 Amount 列中。由于列的含义发生了变化,您可以使用 df.rename()

将该列重命名为另一个
df = df.rename(columns={'Amount':'Total'})

如果你想从其他列中保留一个值,你可以使用 agg(),它接受​​轴标签的字典 -> 指定应该对每一列执行什么操作的函数。

df.groupby(['Fullname', 'Zip'], as_index=False).agg({'Amount': 'sum', 'State': 'first'})