你好,我有一个数据框,如下所示:
Supplier_number Supplier_name Supply_cat USD
0 111 A Cat_1 1
1 221 B Cat_1 2
2 222 B Cat_1 3
3 331 C Cat_1 4
4 332 C Cat_2 5
5 441 D Cat_1 6
6 551 E Cat_2 7
7 552 E Cat_1 8
然后运行以下行并返回以下df:
df_2a = df.groupby(['Supplier_number','Supplier_name', 'Supply_cat', ], as_index = False).sum().sort_values('USD')
Supplier_number Supplier_name Supply_cat USD
0 111 A Cat_1 1
1 221 B Cat_1 2
2 222 B Cat_1 3
3 331 C Cat_1 4
4 332 C Cat_2 5
5 441 D Cat_1 6
6 551 E Cat_2 7
7 552 E Cat_1 8
但是我想要获得的df就像下面的
Supplier_number Supplier_name Supply_cat USD
0 111 A Cat_1 1
**1 221 B Cat_1 5
2 222**
3 331 C Cat_1 4
4 332 C Cat_2 5
5 441 D Cat_1 6
6 551 E Cat_2 7
7 552 E Cat_1 8
逻辑:相同的供应商名称,相同的供应类别,多个供应商编号-将供应商名称和供应类别分组,将美元加总,但保持供应商编号不变
首先感谢您的帮助。
答案 0 :(得分:1)
DataFrame的大小将与原始大小相同。因此,我们可以先计算美元,然后将重复的单元格放入NaN
中。
我们可以尝试使用GroupBy.transform
+ sum
获取USD
列。然后,您可以mask
与DataFrame.duplicated
columns_group = ['Supplier_name', 'Supply_cat']
mask_columns = df.columns.difference(['Supplier_number'])
df['USD'] = df.groupby(columns_group)['USD'].transform('sum')
df[mask_columns] = df[mask_columns].mask(df.duplicated(columns_group))
#if you want blanks instead NaN
#df[mask_columns] = df[mask_columns].mask(df.duplicated(columns_group), '')
print(df)
输出
Supplier_number Supplier_name Supply_cat USD
0 111 A Cat_1 1.0
1 221 B Cat_1 5.0
2 222 NaN NaN NaN
3 331 C Cat_1 4.0
4 332 C Cat_2 5.0
5 441 D Cat_1 6.0
6 551 E Cat_2 7.0
7 552 E Cat_1 8.0