如何用Lambda筛选同时包含ROBERT和JAMES的DataFrame行?
问题描述
我有一个包含人员全名的DataFrame:
d = {'col1': ["JOHN JAMES CONNOR", "ROBERT JAMES FORBIS", "JOSEPH ROBERT SUM", "JAMES LUM ROBERT", "MARGARET ADELMAN JOHNSON", "JAMES ROBERT SMITH"]} df = pd.DataFrame(data=d, index=[0, 1, 2, 3, 4, 5])
对应的表格:
| col1 |
|---|
| JOHN JAMES CONNOR |
| ROBERT JAMES FORBIS |
| JOSEPH ROBERT SUM |
| JAMES LUM ROBERT |
| MARGARET ADELMAN JOHNSON |
| JAMES ROBERT SMITH |
我希望筛选出同时包含ROBERT和JAMES的行(不考虑词的顺序),预期结果:
| col1 |
|---|
| ROBERT JAMES FORBIS |
| JAMES LUM ROBERT |
| JAMES ROBERT SMITH |
尝试了以下代码:
d[lambda x: x['col1'].str.contains('ROBERT', na=False)] & d[lambda x: x['col1'].str.contains('JAMES', na=False)]
但报错:
TypeError: unsupported operand type(s) for &: 'float' and 'bool'
解决方案
错误原因
你犯了两个关键错误:
d是原始字典,不是DataFrame对象,直接用d[lambda x: ...]无法生成正确的布尔索引,返回的混合类型触发了类型不匹配报错。- 即使操作对象是DataFrame,直接用
&连接两个切片结果也不符合语法,应该先生成独立的布尔掩码,再组合筛选。
正确实现方式
先将字典转为DataFrame并赋值给变量,生成两个布尔掩码后用&组合筛选:
import pandas as pd d = {'col1': ["JOHN JAMES CONNOR", "ROBERT JAMES FORBIS", "JOSEPH ROBERT SUM", "JAMES LUM ROBERT", "MARGARET ADELMAN JOHNSON", "JAMES ROBERT SMITH"]} df = pd.DataFrame(data=d, index=[0, 1, 2, 3, 4, 5]) # 生成两个布尔掩码 has_robert = df['col1'].str.contains('ROBERT', na=False) has_james = df['col1'].str.contains('JAMES', na=False) # 组合掩码并筛选 result = df[has_robert & has_james] print(result)
也可以用更简洁的链式写法:
result = df[df['col1'].str.contains('ROBERT', na=False) & df['col1'].str.contains('JAMES', na=False)]
扩展:精准匹配完整单词
如果担心出现子字符串误匹配(比如名字里有ROBERTA这类包含ROBERT的情况),可以用正则单词边界\b确保匹配完整单词:
result = df[df['col1'].str.contains(r'\bROBERT\b', na=False) & df['col1'].str.contains(r'\bJAMES\b', na=False)]
内容的提问来源于stack exchange,提问作者Julia Affonso
相关产品推荐
相关产品推荐

