如何用Pandas搜索整个DataFrame并返回匹配项的相邻值?
问题描述
我有如下样本数据集:
Protocol Number: xx-yzm2 Section Major Task Budget 1 Study Setup 25303.18 2 Study Setup Per-Location 110037.8 3 Site Identified by CRO 29966.25 4 Pre-study Site Visit (PSSV) 130525.92
我希望使用contains方法搜索整个DataFrame,传入关键词protocol并返回其相邻的值。由于表格结构可能发生变化,无法按列筛选,请问能否通过Pandas实现该需求?输入关键词为protocol时,期望输出为xx-yzm2。
解决方案
可以实现,核心思路是把整个DataFrame转为一维序列,忽略原有表格结构,找到匹配关键词的位置后直接取相邻元素。具体代码如下:
import pandas as pd # 构造示例DataFrame(如果是从文件读取,可替换为pd.read_csv/pd.read_table等方法) data = [ ["Protocol Number:", "xx-yzm2", ""], ["", "", ""], ["Section Major", "Task", "Budget"], [1, "Study Setup", 25303.18], [2, "Study Setup Per-Location", 110037.8], [3, "Site Identified by CRO", 29966.25], [4, "Pre-study Site Visit (PSSV)", 130525.92] ] df = pd.DataFrame(data) # 将二维DataFlatten转为一维序列,保留元素顺序 flat_series = df.stack().reset_index(drop=True) # 定位包含关键词的元素索引(不区分大小写,跳过空值) match_index = flat_series[flat_series.str.contains('protocol', case=False, na=False)].index[0] # 获取相邻右侧的目标值 result = flat_series[match_index + 1] print(result) # 输出:xx-yzm2
关键细节说明
stack()方法会把DataFrame的所有行、列元素按顺序压成一维序列,彻底摆脱原表格结构限制;str.contains参数case=False实现不区分大小写搜索,na=False避免空值匹配报错;- 如果关键词和目标值是上下相邻(而非左右),只需把
match_index + 1替换为match_index + df.shape[1](每一行的元素数量等于列数,下一行元素的索引为当前索引加列数)。
内容的提问来源于stack exchange,提问作者Mike Mann
相关产品推荐
相关产品推荐

