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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:18:05