Pandas重复属性的总和

use*_*240 8 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        .             .       .
Run Code Online (Sandbox Code Playgroud)

我想创建一个名为"Total"的新专栏,其中包含每个人的总金额.(由fullname和zip标识).我很难找到正确的解决方案.

我们只需调用我的csv import csvfile.这就是我所拥有的.

import Pandas
df = pandas.read_csv('csvfile.csv', header = 0) 
df.sort(['fullname'])
Run Code Online (Sandbox Code Playgroud)

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

EdC*_*ica 26

我想你想要这个:

df['Total'] = df.groupby(['Fullname', 'Zip'])['Amount'].transform('sum')
Run Code Online (Sandbox Code Playgroud)

因此,groupby将由本集团Fullnamezip列,如你所说,我们再打电话transformAmount列,并通过将字符串中计算出总量sum,这将返回对齐到原来的指数系列df,你就可以删除重复项然后.例如

new_df = df.drop_duplicates(subset=['Fullname', 'Zip'])
Run Code Online (Sandbox Code Playgroud)


Ynj*_*jmh 11

考虑使用以下之一

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')
Run Code Online (Sandbox Code Playgroud)

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

df = df.rename(columns={'Amount':'Total'})
Run Code Online (Sandbox Code Playgroud)

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

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