Pandas查找含列表的列匹配查询元素对应列值报KeyError
报错根因
df.set_index('Col1').loc[query]的逻辑和需求完全不匹配:这段代码会把Col1设为行索引后,直接从索引中查找值为watermelon、grape的行,但Col1存储的是人名,不存在这两个值,必然触发KeyError。
你的实际需求是筛选Col2列的列表中包含query列表任意元素的行,再提取对应Col1的值,直接走索引匹配的思路从一开始就错了。
可直接运行的实现代码
写法1:直观易读(小数据量推荐)
用集合交集判断每行的Col2是否包含query中的元素,逻辑直白好维护:
import pandas as pd df = pd.DataFrame({'Col1': ['Jack', 'Mary', 'Andrew'], 'Col2': [['apple', 'banana', 'papaya', 'tomato'],['berry', 'juice', 'watermelon'], ['cabbage', 'grape']]}) query = ['watermelon', 'grape'] # 筛选符合条件的行,仅保留Col1列并重排索引 res = df[df['Col2'].apply(lambda cell: bool(set(cell) & set(query)))][['Col1']].reset_index(drop=True) print(res)
运行输出完全匹配预期:
Col1 0 Mary 1 Andrew
写法2:高性能写法(大数据量推荐)
用explode把Col2的列表拆成单行单元素再做匹配,比apply循环速度快很多:
res = df.explode('Col2').query("Col2 in @query").drop_duplicates('Col1')[['Col1']].reset_index(drop=True)
内容的提问来源于stack exchange,提问作者nerd
相关产品推荐
相关产品推荐

