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
相关产品推荐
相关产品推荐

