提问人:Jay Cheng 提问时间:9/12/2020 最后编辑:Sunderam DubeyJay Cheng 更新时间:7/8/2022 访问量:163
Pandas groupby 多个列,但需要在 groupby 之后的列中显示唯一值
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
逻辑:相同的供应商名称、相同的供应类别、多个供应商编号 - 对供应商名称和供应类别进行分组,将美元相加,但保持供应商编号不变。
答:
1赞
ansev
9/12/2020
#1
DataFrame 的大小将与原始数据帧的大小相同。因此,我们可以先计算美元,然后将重复的单元格放入 .
我们可以尝试使用 GroupBy.transform
+ 来获取列。然后,您可以使用 DataFrame.duplicated
屏蔽
重复项NaN
sum
USD
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
评论