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

