如何用Pandas匹配正则表达式查找Excel单元格的行索引与列名
从半结构化Excel提取目标键值对:同时定位行与列
需求说明
解析半结构化Excel文件,提取符合正则表达式pattern = r'[Tt]emperature|[Ss]tren|[Cc]omment'的键值对:
- 所有匹配的键位于同一列
- 对应的值在键所在列的右侧列中
- 需要同时完成两个目标:
- 获取所有包含匹配键的行索引列表
- 定位包含这些键的目标列名
示例数据
构造示例DataFrame模拟半结构化Excel内容:
import pandas as pd import numpy as np df_original = pd.DataFrame({'Unnamed: 0':['Value', 'Name', np.nan, 'Mark', 'Molly', 'Jack', 'Tom', 'Lena', np.nan, np.nan], 'Unnamed: 1':['High', 'New York', np.nan, '5000', '5250', '4600', '2500', '4950', np.nan, np.nan], 'Unnamed: 2':[np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], 'Unnamed: 3':['Other', 125, 127, np.nan, np.nan, 'Temperature (C)', 'Strength', np.nan, 'Temperature (F)', 'Comment'], 'Unnamed: 4':['Other 2', 25, 14.125, np.nan, np.nan, np.nan, '1500', np.nan, np.nan, np.nan], 'Unnamed: 5':[np.nan, np.nan, np.nan, np.nan, np.nan, 25, np.nan, np.nan, 77, 'Looks OK'], 'Unnamed: 6':[np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 'Add water'], })
整合解决方案代码
以下代码同时完成目标行索引收集、目标列定位,并最终提取目标键值范围:
import pandas as pd import numpy as np pattern = r'[Tt]emperature|[Ss]tren|[Cc]omment' # 1. 遍历列,定位包含目标键的列,同时记录行匹配掩码 target_col = None row_masks = [] for col in df_original.columns: col_mask = df_original[col].str.contains(pattern, regex=True, na=False) if col_mask.any(): target_col = col row_masks.append(col_mask) # 2. 获取所有匹配行的索引 combined_mask = np.any(row_masks, axis=0) row_range = df_original[combined_mask].index.tolist() # 3. 提取目标键值范围数据 if target_col: col_idx = df_original.columns.get_loc(target_col) col_range = df_original.columns[col_idx:] target = df_original.loc[row_range, col_range] print(target) else: print("未找到匹配目标键的列")
代码解释
- 目标列定位:遍历每一列,用
str.contains检查列内是否存在匹配正则的内容,找到符合条件的列作为target_col - 目标行索引收集:同步记录列的匹配掩码,合并后筛选出所有包含目标键的行索引
- 数据提取:通过目标列的位置,获取该列及右侧所有列,结合目标行索引提取出包含键值对的子DataFrame
输出结果
运行代码后得到的目标子DataFrame:
Unnamed: 3 Unnamed: 4 Unnamed: 5 Unnamed: 6 5 Temperature (C) NaN 25 NaN 6 Strength 1500 NaN NaN 8 Temperature (F) NaN 77 NaN 9 Comment NaN Looks OK Add water
内容的提问来源于stack exchange,提问作者qoob
相关产品推荐
相关产品推荐

