Pandas groupby总和保持第三列

时间:2018-02-12 13:56:34

标签: python pandas

我有一个如下所示的数据集:

Master  Sec     Amount
1234    98765   191
1234    98765   926
1234    98764   236
2345    76543   233
2345    76543   963
3456    54321   221
3456    54321   820
3456    43210   281
3456    32101   786

我想要的是将Master与金额合并,然后将该数字应用于sec字段中的所有唯一身份,如果这是有意义的。

结果看起来像这样:

Sec     Amount
98765   1353
98764   1353
76543   1196
54321   2108
43210   2108
32101   2108

我的代码已经执行了此操作:

newdf= df[['Sec', 'Master']]
df = df[['Master', 'Amount']]
df = df.groupby(['Master'], as_index=False)['Amount'].sum()  
newdf = pd.merge(newdf, df, on='Master')
newdf = newdf[['Sec', 'Amount']]
newdf = newdf.drop_duplicates()

但是创建一个新的数据帧似乎并不特别pythonic,我猜测Pandas有更好的方法来做到这一点。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

这是一种方法。由于groupby会返回一个系列,您可以使用它来映射Master,最后删除重复的行。

import pandas as pd

df = pd.DataFrame([[1234, 98765, 191],
                   [1234, 98765, 926],
                   [1234, 98764, 236],
                   [2345, 76543, 233],
                   [2345, 76543, 963],
                   [3456, 54321, 221],
                   [3456, 54321, 820],
                   [3456, 43210, 281],
                   [3456, 32101, 786]],
                  columns=['Master', 'Sec', 'Amount'])

df['Amount'] = df['Master'].map(df.groupby('Master')['Amount'].sum())
df = df[['Sec', 'Amount']].drop_duplicates()

#      Sec  Amount
# 0  98765    1353
# 2  98764    1353
# 3  76543    1196
# 5  54321    2108
# 7  43210    2108
# 8  32101    2108

答案 1 :(得分:2)

使用GroupBy.transform添加DataFrame.drop_duplicates的新列,以便按list中指定的列删除重复项:

df['Amount'] = df.groupby('Master')['Amount'].transform('sum')
df = df.drop_duplicates(['Sec', 'Amount'])
print (df)
   Master    Sec  Amount
0    1234  98765    1353
2    1234  98764    1353
3    2345  76543    1196
5    3456  54321    2108
7    3456  43210    2108
8    3456  32101    2108