当前位置: 代码迷 >> python >> Pandas groupby总和保持第三列
  详细解决方案

Pandas groupby总和保持第三列

热度:115   发布时间:2023-07-16 11:16:20.0

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

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字段中的所有uniques,如果这有意义的话。

结果看起来像这样:

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有更好的方法来做到这一点。

有什么建议?

这是一种方式。 由于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

使用与新列通过在specifyning列删除重复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
  相关解决方案