Python按Order列统计物料各状态数量的实现求助
实现按订单统计不同状态的物料数量
我来帮你搞定这个需求!你已经完成了「Total Materials」列的统计,剩下的各状态物料数量统计可以用 pandas 的哑变量转换 + 分组求和来实现,具体步骤如下:
步骤1:回顾已实现的总物料数统计
你已经写出了正确的代码来计算每个订单的总物料数,这里再整合到完整流程里:
# 计算每个Order对应的总物料数并添加到原数据集 ds['Total Materials'] = ds.groupby('Order')['Order'].transform('count')
步骤2:统计各状态下的物料数量
我们可以通过以下两步实现:
- 用
pd.get_dummies()将status列转换为多个二进制列(每个状态对应一列,该行符合状态则为1,否则为0) - 按
Order分组对这些二进制列求和,再用transform将结果映射回原数据的每一行,这样同一订单的所有行都会显示该订单对应状态的物料数量
具体代码:
import pandas as pd # 生成status列的哑变量(每个状态对应独立列) status_dummies = pd.get_dummies(ds['status']) # 按Order分组,对每个状态列求和,并用transform将结果映射到每一行 status_counts = status_dummies.groupby(ds['Order']).transform('sum') # 将状态统计列合并到原数据集 ds = pd.concat([ds, status_counts], axis=1)
最终结果
执行完上述代码后,你会得到和期望完全一致的数据集:
| no | Order | materials | status | Total Materials | available | not available | Feb-20 |
|---|---|---|---|---|---|---|---|
| 1 | 1000 | 100 | available | 2 | 1 | 1 | 0 |
| 2 | 1000 | 200 | not available | 2 | 1 | 1 | 0 |
| 3 | 1001 | 500 | Feb-20 | 1 | 0 | 0 | 1 |
| 4 | 1002 | 400 | available | 4 | 3 | 1 | 0 |
| 5 | 1002 | 300 | not available | 4 | 3 | 1 | 0 |
| 6 | 1002 | 600 | available | 4 | 3 | 1 | 0 |
| 7 | 1002 | 900 | available | 4 | 3 | 1 | 0 |
| 8 | 1003 | 700 | available | 2 | 2 | 0 | 0 |
| 9 | 1003 | 800 | available | 2 | 2 | 0 | 0 |
内容的提问来源于stack exchange,提问作者Nurbek Kuantyrov
相关产品推荐
相关产品推荐

