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

如何根据列名匹配替换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矢量化操作+映射字典:

  1. 生成列名到替换值的映射字典
    把names_values转换成字典,方便快速查找:
name_map = names_values.set_index('Names')['Values'].to_dict()
  1. 批量替换含"<"的单元格
    遍历每一列,用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:53:18