python - Pandas groupby 多列,但需要在 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 将具有与原始大小相同的大小。所以我们可以先计算美元,然后将重复的单元格放入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
推荐阅读
- linq - 不以指数方式加入所有事情的最佳方法是什么?
- javascript - 使用 raw-loader 为类生产环境禁用 vue.js 网站的热重载
- python - 安装更新 cheetah==2.4.4 出现问题
- python - 如何检查 PyTorch 是否将我的 GPU 与 CUDA 一起使用?
- javascript - 如何从 React Native 中动态创建的 textInput 获取值?
- javascript - Next.Js 带有样式组件的 React 应用程序。警告:道具 `className` 不匹配。服务器:“x” 客户端:“y”
- batch-file - 批处理文件以检查是否正确的用户登录以继续设置,否则打开带有警告的 .txt 以登录另一个用户
- angular - 在 Ngrx 中设置减速器
- javascript - @input 仅在单击按钮时输入新项目
- prestashop - 无法设置商店 URL,Prestashop 1.6 配置摘要中的商店 URL 下没有任何内容