如何根据列名匹配替换DataFrame中含"<"子串的单元格值?
解决方案:替换DataFrame中含"<"的单元格值
需求说明
遍历main_frame的所有列,找出包含子串<的单元格,将其替换为names_values数据框中与列名匹配的Names行对应的Values值。
修正数据初始化问题
首先注意:你原来创建names_values时用了columns=[['Names', 'Values']],这会生成多层列索引,后续映射会出问题,先修正为普通列:
import pandas as pd # 修正后的names_values创建 data = [['Fiona','5'], ['Chris','6'], ['Mason','7'], ['June','8']] names_values = pd.DataFrame(data, columns=['Names', 'Values']) # 原main_frame创建不变 data1 = {'Fiona':['<2', '3','4'], 'Chris': ['<7','12','8'], 'Mason': ['2','<3','11'], 'June': ['1','2','<9']} main_frame = pd.DataFrame(data1)
高效实现方案
避免用iterrows()(效率极低,不适合大数据量),改用pandas矢量化操作+映射字典:
- 生成列名到替换值的映射字典
把names_values转换成字典,方便快速查找:
name_map = names_values.set_index('Names')['Values'].to_dict()
- 批量替换含"<"的单元格
遍历每一列,用mask()方法定位含<的单元格,直接替换为对应映射值:
for col in main_frame.columns: # 筛选出当前列含"<"的单元格,替换为name_map中对应列名的值 main_frame[col] = main_frame[col].mask(main_frame[col].str.contains('<'), name_map[col])
验证结果
执行后输出main_frame,会和你期望的end_goal完全一致:
print(main_frame) # 输出: # Fiona Chris Mason June # 0 5 6 2 1 # 1 3 12 7 2 # 2 4 8 11 8
为什么你的原方法没成功?
match()方法是用来查找正则表达式的起始匹配位置,不是判断是否包含子串,应该用str.contains()。iterrows()逐行处理不仅效率低,还容易因为索引、数据类型问题出错,pandas的矢量化操作才是最优解。
内容的提问来源于stack exchange,提问作者brown_squirrel
相关产品推荐
相关产品推荐

