我有一个如下所示的数据集:
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有更好的方法来做到这一点。
有什么建议吗?
答案 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