pandas如何使用loc筛选值为列表类型的DataFrame列
列表类型列筛选的正确实现
原写法失效原因
存储列表的列属于object类型,直接使用== [目标列表]的写法时,pandas会把右侧传入的列表当做和Series等长的数组,做逐位对齐的广播比较,而非逐行判断单元格内的列表和目标列表内容是否完全相等。比如示例中dffsm['State'] == ['A']实际是拿单元格里的['A']和右侧列表的第一个元素'A'做对比,自然匹配不到结果。
可用实现方案
方案1:逐行值对比(通用无兼容问题)
通过apply逐行读取单元格内的列表,直接和目标列表做内容等值判断,生成布尔掩码后传入.loc筛选即可,适配所有列表内容场景:
target = ['A'] filter_mask = dffsm['State'].apply(lambda cell_val: cell_val == target) result = dffsm.loc[filter_mask]
方案2:转元组后等值判断(性能更优)
列表是不可哈希类型,将列内所有列表统一转换为可哈希的元组后,就可以直接用常规的==语法做等值匹配,数据量较大时运行速度比逐行apply对比更快:
target = ('A',) # 目标值同步转为元组格式 filter_mask = dffsm['State'].apply(tuple) == target result = dffsm.loc[filter_mask]
如果需要频繁对该列做筛选操作,可以直接把整列值替换为元组存储,省去每次筛选时的转换开销:
# 预先转换列存储格式 dffsm['State'] = dffsm['State'].apply(tuple) # 后续可直接用普通等值语法筛选 result = dffsm.loc[dffsm['State'] == ('A',)]
补充说明
- 对比时必须用
==判断内容一致性,不要用is判断对象身份,否则会因为内存地址不同导致匹配失败 - 如果不需要完全匹配整个列表,仅需要判断列表中是否包含某个元素,可以将判断逻辑改为
dffsm['State'].apply(lambda x: 'A' in x)生成筛选掩码
内容的提问来源于stack exchange,提问作者townes
相关产品推荐
相关产品推荐

