在Pandas DataFrame中按指定列序列匹配行并提取值
解决方案
要实现适配列名和列数量变化的通用匹配方案,核心是动态生成目标列名并批量验证行匹配,具体步骤如下:
- 动态生成目标列名
根据输入的in_列表,用列表推导式生成对应DataFrame列名,比如in_=[2,3]会生成['A2','A3']:
cols = [f'A{i}' for i in in_]
- 生成批量匹配掩码
利用pandas的eq()方法批量对比目标列与li的对应值,再通过all(axis=1)判断每行是否所有列都匹配成功:
mask = df[cols].eq(li).all(axis=1)
- 提取匹配结果
用掩码筛选出匹配行,直接获取索引和A1列的值:
# 获取匹配行索引(多行匹配时返回索引数组) matched_indexes = df[mask].index # 获取匹配行的A1列值(多行匹配时返回Series) a1_values = df.loc[mask, 'A1']
完整示例验证
用你提供的示例DataFrame测试:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], columns=['A1', 'A2', 'A3']) # 可变输入参数 in_ = [2, 3] li = [5, 6] # 执行匹配逻辑 cols = [f'A{i}' for i in in_] mask = df[cols].eq(li).all(axis=1) matched_indexes = df[mask].index a1_values = df.loc[mask, 'A1'] print(f"匹配行索引:{matched_indexes.tolist()}") print(f"A1列对应值:{a1_values.tolist()}")
输出结果:
匹配行索引:[1] A1列对应值:[4]
边界情况处理
如果担心无匹配行导致报错,可添加判断逻辑:
if mask.any(): matched_indexes = df[mask].index a1_values = df.loc[mask, 'A1'] else: print("未找到匹配行")
内容的提问来源于stack exchange,提问作者edgar
相关产品推荐
相关产品推荐

