如何在Pandas中查找各客户无对应发票号的零件编号
问题解决:按客户维度找出无对应发票的零件编号
原代码问题分析
- 列名不匹配:代码中使用了英文列名
'part number'、'invoice no',但实际DataFrame的列是中文的'零件编号'、'发票号',导致关联逻辑失效。 - 逻辑偏差:原思路仅能找出全表无发票记录的零件(如df2中的P06),但需求是每个客户自身未购买的零件(从目标零件池中排除该客户已购的)。
正确实现代码
import pandas as pd # 构造测试数据(替换为你的实际DataFrame) df1 = pd.DataFrame({ '客户': ['A', 'B', 'C', 'D', 'E'], '销售': ['John']*5, '发票号': ['123', '456', '789', '1011', '1213'], '产品子类别': ['SubA', 'SubB', 'SubC', 'SubC', 'SubA'], '零件编号': ['P01', 'P02', 'P03', 'P04', 'P05'] }) df2 = pd.DataFrame({ '产品子类别': ['SubA', 'SubA', 'SubB', 'SubB', 'SubC', 'SubC'], '零件编号': ['P01', 'P05', 'P02', 'P06', 'P03', 'P04'] }) # 选择零件池:如果是df1中所有有发票的零件,用下面一行;如果是df2全量零件,替换为df2['零件编号'] all_parts = set(df1['零件编号'].unique()) # 按客户分组,收集每个客户已购买的零件集合 customer_purchased = df1.groupby('客户')['零件编号'].apply(set).reset_index(name='已购零件') # 计算未购买零件并格式化为字符串 customer_purchased['零件编号'] = customer_purchased['已购零件'].apply( lambda x: ', '.join(sorted(all_parts - x)) ) # 整理成目标输出格式 result = customer_purchased[['客户', '零件编号']] print(result)
代码说明
- 确定零件池:根据需求选择全量零件范围(df1有发票的零件/df2所有零件)。
- 分组收集已购零件:按客户分组,将每个客户的已购零件转为集合,方便快速计算差集。
- 计算未购零件:用全量零件集合减去客户已购集合,排序后拼接为逗号分隔的字符串。
- 输出结果:保留需要的列,得到目标格式的DataFrame。
运行后输出与期望结果完全一致:
| 客户 | 零件编号 |
|---|---|
| A | P02, P03, P04, P05 |
| B | P01, P03, P04, P05 |
| C | P01, P02, P04, P05 |
| D | P01, P02, P03, P05 |
| E | P01, P02, P03, P04 |
内容的提问来源于stack exchange,提问作者rainy days.
相关产品推荐
相关产品推荐

