DataFrame新建列时isin方法在脚本与Jupyter运行结果不一致问题
问题排查方案
1 优先排查数据类型不匹配问题
这是该类问题最高发的原因,Jupyter运行过程中可能手动调整过列类型,而脚本读取数据时依赖pandas自动类型推断,会出现两边类型不一致的情况:
- 两边分别打印
df.DeliveryId.dtype和type(delivery_list[0])对比是否匹配 - 强制统一类型再做匹配,参考代码:
# 统一转为字符串并去除前后不可见空格 df['DeliveryId'] = df['DeliveryId'].astype(str).str.strip() delivery_list = [str(i).strip() for i in delivery_list]
如果DeliveryId包含字母,可额外统一大小写:
df['DeliveryId'] = df['DeliveryId'].str.lower() delivery_list = [i.lower() for i in delivery_list]
2 排查delivery_list加载差异
脚本运行时的工作目录和Jupyter默认工作目录可能不同,会导致读取delivery_list的文件路径失效,加载到错误/空的列表:
- 两边分别打印
len(delivery_list)和delivery_list[:5]对比列表内容和长度是否一致 - 脚本中读取文件时建议使用绝对路径,避免相对路径的工作目录差异问题
3 排查df加载差异
确认脚本中读取的DataFrame和Jupyter中使用的是同一份源数据:
- 两边分别打印
len(df)和df.DeliveryId.head(5).tolist()对比是否一致 - 检查脚本中df的前置处理逻辑是否和Jupyter完全对齐,避免遗漏过滤、拼接等操作
优化调试代码
可以在函数中加入统一的调试输出,快速定位差异点:
def get_percent(df, delivery_list): # 调试输出,对比Jupyter和脚本的运行结果 print("=== 调试信息 ===") print(f"DeliveryId列类型: {df.DeliveryId.dtype}") print(f"DeliveryId前3个值: {df.DeliveryId.head(3).tolist()}") print(f"匹配列表长度: {len(delivery_list)}") print(f"匹配列表前3个值: {delivery_list[:3]}") print(f"匹配列表第一个值类型: {type(delivery_list[0]) if delivery_list else '列表为空'}") df['col_new'] = df.DeliveryId.isin(delivery_list) print(f"匹配结果统计:\n{df.col_new.value_counts()}") pct = round((df.col_new.sum()/len(df)) * 100, 1) print(f'% of Deliveries: {pct}%') return df
另外原来的匹配占比计算可以直接用布尔列求和,不用筛选长度,性能更好也更简洁。
内容的提问来源于stack exchange,提问作者Parker.V
相关产品推荐
相关产品推荐

