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

Pandas列表匹配df1列时在df2新建列取对应值问题排查

现存问题
  • 核心逻辑对象搞反:代码是对df1做逐行apply计算,但df1只有4行数据,最终要给5行的df2赋值新列,长度不匹配直接导致最后一行出现NaN;且需求是基于df2每行的level值做匹配判断,遍历df1完全不符合逻辑。
  • 类型匹配错误:代码将df1的Numbers值转为字符串后,再判断是否在lst中,但lst内的20、40是整数类型,字符串'20'、'40'和整数20、40不相等,导致所有匹配逻辑失效,全返回0。
  • 存在低级笔误:代码中print(df)未定义df变量,运行时会直接抛出NameError异常,实际是要打印df1。
修正方案

正确逻辑是:先基于df1构建Numbers到Letters的映射字典,再逐行判断df2的level值:如果值在lst中且能在映射字典中找到对应值,就返回对应的Letters,否则返回0。
修正后可直接运行的代码如下:

import pandas as pd
  
# 初始化源数据
new_data = [[10,'a'], [20, 'b'], [30, 'c'], [40, 'd']]
old_data = [['10a','A', 10.05], [22, 'B', 12.10], [40, 'C', 1.10], 
[20, 'D', 8.05], [15, 'E', 9.00]]
lst = [20, 40, 50, 70, '20a']
  
# 创建DataFrame
df1 = pd.DataFrame(new_data, columns=['Numbers', 'Letters'])
print(df1)
df2 = pd.DataFrame(old_data, columns=['level', 'cap', 'time'])

# 构建编号到字母的映射字典
num_map = dict(zip(df1['Numbers'], df1['Letters']))
# 逐行匹配生成Exit列
df2['Exit'] = df2['level'].apply(lambda x: num_map.get(x, 0) if x in lst else 0)
print(df2)

运行后输出完全符合预期:

level cap   time Exit
0   10a   A  10.05    0
1    22   B  12.10    0
2    40   C   1.10    d
3    20   D   8.05    b
4    15   E   9.00    0

内容的提问来源于stack exchange,提问作者Starter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:09:18