如何在Pandas DataFrame中查找列表值并提取匹配行?
在Pandas中提取包含列表任意值的行的最优方法
你的现有代码存在一个问题:i[i.isin(numbers)]会保留所有行,但仅在匹配的列显示对应值,不匹配的列会显示NaN,并不是真正提取整行包含目标值的数据。下面是最优实现方案:
核心思路
用isin()判断每个元素是否在目标列表中,再通过any(axis=1)检查每行是否存在至少一个匹配值,以此作为行索引提取整行数据。
修正后的代码
方案1:返回DataFrame(最常用,保留原数据结构)
import pandas as pd import os def searchXlsx(xlsx_file: str, numbers: list) -> pd.DataFrame: # pd.read_excel可直接接收文件路径,无需手动open df = pd.read_excel(os.path.realpath(xlsx_file)) # 筛选出任意列包含列表中值的行 result = df[df.isin(numbers).any(axis=1)] return result
方案2:返回列表(符合你函数标注的返回类型,每行转字典)
import pandas as pd import os def searchXlsx(xlsx_file: str, numbers: list) -> list: df = pd.read_excel(os.path.realpath(xlsx_file)) result_df = df[df.isin(numbers).any(axis=1)] # 转成字典列表返回 return result_df.to_dict('records')
优化技巧
- 如果只需要在特定列中匹配(比如只在
'编号'列查找),可以缩小判断范围,提升效率:result = df[df['编号'].isin(numbers)] - 如果目标列表是字符串且需要模糊匹配,可以用
str.contains()结合|拼接匹配条件,但精确匹配场景下isin()是最优选择。
内容的提问来源于stack exchange,提问作者Joka
相关产品推荐
相关产品推荐

