遍历Pandas DataFrame时不覆盖已有标记结果的问题求解
问题根因
原有核心代码的错误来源于双重循环的遍历顺序错误:先遍历列、再遍历行的逻辑生成的列表是按「B1列所有行→B2列所有行→…→B5列所有行」的顺序拼接的一维序列,赋值给DataFrame新列时只会截取前N个(N为你的数据行数)元素,自然只能匹配到第一列的数值,后续列的匹配结果全部丢失。
可行解决方案
推荐使用Pandas向量化操作实现需求,性能远高于逐行遍历,代码如下:
import numpy as np # 提取需要匹配的B1-B5列 target_cols = df[["B1", "B2", "B3", "B4", "B5"]] # 遍历1-9生成标记列 for num in range(1, 10): # 逐行判断是否存在对应数值,存在则标记X否则为空 df[num] = np.where(target_cols.eq(num).any(axis=1), "X", "")
如果你的数据量很小,也可以用apply方法修正原有逻辑:
for num in range(1, 10): df[num] = df.apply(lambda row: "X" if num in row[1:6].values else "", axis=1)
两种方案都可以实现「某行B1-B5列只要出现对应数值,标记列就填X」的需求,不会出现匹配结果丢失的问题。
内容的提问来源于stack exchange,提问作者ok-programmer
相关产品推荐
相关产品推荐

