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

Pandas如何提取匹配指定字符串的单元格值及对应列名生成新列

实现代码

通用适配版(支持一行多个匹配项)

import pandas as pd

df = pd.read_excel(r"Test_file")
keywords = ['Chann', 'Midm']

# 预转换全表为字符串,避免重复转换开销
str_df = df.astype(str)
# 生成每个单元格是否匹配关键词的布尔矩阵
match_matrix = str_df.applymap(lambda x: any(key in x for key in keywords))

def parse_row_match(row):
    # 获取当前行所有匹配的列名
    matched_cols = match_matrix.columns[row]
    if not len(matched_cols):
        return ""
    # 多个匹配项用逗号分隔,可按需修改分隔符
    return ",".join([f"{col}||{str_df.loc[row.name, col]}" for col in matched_cols])

df['Match'] = match_matrix.apply(parse_row_match, axis=1)

性能优化版(仅取每行第一个匹配项,适合20万行以上大表提速)

如果你的表中每行最多只有1个匹配关键词的单元格,用该版本速度提升5-10倍:

import pandas as pd
import numpy as np

df = pd.read_excel(r"Test_file")
keywords = ['Chann', 'Midm']

str_df = df.astype(str)
match_matrix = str_df.applymap(lambda x: any(key in x for key in keywords))
row_has_match = match_matrix.any(axis=1)

# 取每行第一个匹配的列名
df['matched_col'] = match_matrix.idxmax(axis=1).where(row_has_match, "")
# 取对应单元格的值,pandas 2.0+版本可替换为下方注释代码
df['matched_val'] = str_df.lookup(df.index, df['matched_col'])
# 高版本pandas替代方案:
# df['matched_val'] = str_df.reindex(df['matched_col'], axis=1).to_numpy()[np.arange(len(df)), np.arange(len(df))]

# 拼接最终结果
df['Match'] = df.apply(lambda x: f"{x['matched_col']}||{x['matched_val']}" if x['matched_col'] else "", axis=1)
# 删除临时列
df = df.drop(['matched_col', 'matched_val'], axis=1)

原代码问题说明

你之前的mask是仅标识行是否有匹配的一维布尔数组,df.loc[mask]返回的是匹配行的全量数据,直接赋值给新列时维度不匹配,因此无法得到单元格内容和对应的列名。上述方案通过先构建全量单元格的匹配矩阵,逐行提取匹配的列名和值完成拼接,符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:54:04