基于Pandas DataFrame按物料组合分组聚合订单号的需求
解决方案:分组合并Pandas DataFrame中的订单编号
没问题,这可以通过Pandas的分组(groupby)和聚合操作轻松实现。核心思路是把物料编号(material)、工厂(plant)以及所有m1至m5的列作为分组依据,然后将每组内的订单编号合并成一个字符串。
完整代码示例
import pandas as pd # 先构造你的示例DataFrame(如果已有df可跳过这部分) df = pd.DataFrame({ 'material': [24990, 24990, 24990, 24990, 166621, 166621, 240758, 276009, 276009], 'plant': [89952, 89952, 89952, 89952, 3062, 3062, 3062, 3062, 3062], 'Order': ['4568789', '5098710', '9448609', '1007081', '18364103', '78309139', '55146035', '38501581', '38575428'], 'm1': [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0], 'm2': [1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0], 'm3': [0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0], 'm4': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 'm5': [0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0] }) # 执行分组聚合:按material、plant和m1-m5分组,合并Order列 grouped_df = df.groupby( ['material', 'plant', 'm1', 'm2', 'm3', 'm4', 'm5'] )['Order'].agg(', '.join).reset_index() # 查看结果 print(grouped_df)
关键步骤说明
- 确定分组键:我们需要同时按
material、plant以及m1到m5所有列分组,这样才能保证只有物料编号相同、工厂相同且m1-m5组合完全一致的记录会被分到同一组。 - 聚合订单列:使用
agg(', '.join)把每组内的Order值合并成一个用逗号分隔的字符串。如果你的Order列是数值类型(比如int),记得先转成字符串再合并,避免报错:# 处理数值类型的Order列 grouped_df = df.groupby( ['material', 'plant', 'm1', 'm2', 'm3', 'm4', 'm5'] )['Order'].agg(lambda x: ', '.join(x.astype(str))).reset_index() - 重置索引:
groupby操作后,分组键会变成DataFrame的索引,用reset_index()把它们转回普通列,方便后续查看和处理。
运行后结果示例
| material | plant | m1 | m2 | m3 | m4 | m5 | Order |
|---|---|---|---|---|---|---|---|
| 24990 | 89952 | 1.0 | 1.0 | 0.0 | 0.0 | 0.0 | 4568789, 5098710 |
| 24990 | 89952 | 0.0 | 0.0 | 1.0 | 0.0 | 1.0 | 9448609, 1007081 |
| 166621 | 3062 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 18364103 |
| 166621 | 3062 | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 | 78309139 |
| 240758 | 3062 | 1.0 | 1.0 | 1.0 | 0.0 | 0.0 | 55146035 |
| 276009 | 3062 | 1.0 | 1.0 | 1.0 | 0.0 | 0.0 | 38501581, 38575428 |
内容的提问来源于stack exchange,提问作者Rocky
相关产品推荐
相关产品推荐

