如何过滤Pandas DataFrame中Names列含指定元素的行?解决contains报错
Pandas筛选列表列包含指定元素的行
先还原你的示例DataFrame:
import pandas as pd data = { 'Department': ['History', 'Economics', 'Physics'], 'Names': [['Carl', 'Julia', 'Jens'], ['Maggie', 'Lisa', 'Jules'], ['Freddy', 'Mark', 'Rolf']] } df = pd.DataFrame(data)
为什么str.contains()会报错?
str.contains()是Pandas专门针对字符串类型列的方法,你的Names列每个单元格是列表而非字符串,直接调用会触发类型不匹配错误,所以不能用这个方法。
解决方法
1. 筛选包含单个指定名字的行
用apply()结合in运算符遍历每个列表,判断目标名字是否存在:
# 筛选包含Julia的行 result = df[df['Names'].apply(lambda x: 'Julia' in x)]
运行后会得到Index为0的History行。
2. 筛选包含指定列表中任一元素的行
比如要找包含['Julia', 'Lisa']中任意一个名字的行,有两种常用方式:
方式一:集合交集判断(效率更高,适合元素多的场景)
把目标列表转成集合,再和每个Names列表转成的集合求交集,只要交集非空就保留该行:
targets = ['Julia', 'Lisa'] target_set = set(targets) result = df[df['Names'].apply(lambda x: bool(set(x) & target_set))]
运行后会得到Index为0(含Julia)和Index为1(含Lisa)的两行。
方式二:any()函数判断(逻辑更直观)
遍历目标列表的每个元素,检查是否有任意一个元素在当前Names列表中:
targets = ['Julia', 'Lisa'] result = df[df['Names'].apply(lambda x: any(name in x for name in targets))]
效果和方式一完全一致。
内容的提问来源于stack exchange,提问作者LightningStack575
相关产品推荐
相关产品推荐

