You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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'

解决方案

错误原因

你犯了两个关键错误:

  1. d是原始字典,不是DataFrame对象,直接用d[lambda x: ...]无法生成正确的布尔索引,返回的混合类型触发了类型不匹配报错。
  2. 即使操作对象是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 08:43:25