You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中查找各客户无对应发票号的零件编号

问题解决:按客户维度找出无对应发票的零件编号

原代码问题分析

  1. 列名不匹配:代码中使用了英文列名'part number'、'invoice no',但实际DataFrame的列是中文的'零件编号'、'发票号',导致关联逻辑失效。
  2. 逻辑偏差:原思路仅能找出全表无发票记录的零件(如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)

代码说明

  1. 确定零件池:根据需求选择全量零件范围(df1有发票的零件/df2所有零件)。
  2. 分组收集已购零件:按客户分组,将每个客户的已购零件转为集合,方便快速计算差集。
  3. 计算未购零件:用全量零件集合减去客户已购集合,排序后拼接为逗号分隔的字符串。
  4. 输出结果:保留需要的列,得到目标格式的DataFrame。

运行后输出与期望结果完全一致:

客户零件编号
AP02, P03, P04, P05
BP01, P03, P04, P05
CP01, P02, P04, P05
DP01, P02, P03, P05
EP01, P02, P03, P04

内容的提问来源于stack exchange,提问作者rainy days.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:43:11