
本文介绍如何利用 Pandas 的 apply 方法配合 Lambda 函数,将两列字符串(以竖线分隔)的集合交集长度映射为二元结果:只要存在至少一个共同元素,即返回 1;否则返回 0。
本文介绍如何利用 pandas 的 `apply` 方法配合 lambda 函数,将两列字符串(以竖线分隔)的集合交集长度映射为二元结果:只要存在至少一个共同元素,即返回 1;否则返回 0。
在数据清洗与特征工程中,我们常需将多值字符串(如 'a|b|c')解析为集合,并判断其与其他字段是否存在交集。原始代码通过 set.intersection() 计算交集长度,但返回的是具体数值(如 2、1、0),而业务需求往往只需布尔语义——“有匹配”或“无匹配”。此时,用 Lambda 函数进行条件映射是最简洁高效的方式。
以下为完整实现示例:
import pandas as pd
df = pd.DataFrame({
'col1': ['a|b|c', 'a|b|c', 'a|b|c'],
'col2': ['b|d|e|a', 'd|e|f', 'a']
})
# ✅ 正确做法:直接返回 1 或 0,而非交集长度
df['new'] = df[['col1', 'col2']].apply(
lambda x: 1 if len(set(x['col1'].split('|')) & set(x['col2'].split('|'))) >= 1 else 0,
axis=1
)
print(df)
输出:
col1 col2 new 0 a|b|c b|d|e|a 1 1 a|b|c d|e|f 0 2 a|b|c a 1
? 技巧优化:
- 使用
&运算符替代intersection()更简洁;>= 1可简化为> 0,语义更自然;- 若仅需布尔值(True/False),可直接写
bool(set(...) & set(...)),再转为 int:int(bool(...)),效果等价且更具可读性。
⚠️ 注意事项:
- 确保输入字符串非空且不含多余空格,否则
split('|')可能产生空字符串,影响集合运算;建议预处理:x['col1'].strip().split('|'); -
axis=1不可省略,否则apply将按列操作,导致报错; - 对于超大数据集,该方法为逐行计算,性能有限;如需加速,可考虑
str.extract+get_dummies或向量化字符串匹配方案。
综上,该 Lambda 表达式精准实现了「存在即为 1」的二值化逻辑,是 Pandas 中处理多值分类匹配任务的经典范式。










