[英]Pandas groupby multiple columns, but need show unique value in a column after groupby
我有一个如下所示的数据框:
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
逻辑:相同的供应商名称、相同的供应类别、多个供应商编号 - 将供应商名称和供应类别分组,汇总美元,但保持供应商编号不变。
DataFrame 将具有与原始大小相同的大小。 所以我们可以先计算 USD ,然后将重复的单元格放入NaN
。 我们可以尝试使用GroupBy.transform
+ sum
来获取USD
列。 然后您可以使用DataFrame.duplicated
mask
重复项
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.