我正在使用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来做我想要的对象。丢弃重复的问题是我将丢失金额或金额可能不同。
答案 0 :(得分:22)
我想你想要这个:
df['Total'] = df.groupby(['Fullname', 'Zip'])['Amount'].transform('sum')
因此,groupby
将按照Fullname
和zip
列进行分组,如您所述,我们会在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'})