
本文介绍如何将 dataframe 中两列以逗号分隔的字符串进行逐行元素级交集运算,并生成新列;支持空交集时返回 `pd.na`,代码简洁高效,适用于文本标签、关键词匹配等场景。
在实际数据处理中,我们常遇到两列存储了用逗号分隔的标签、技能、品类等字符串(如 "#%#$#%@%@%$#%$#%#%#$%@_23eeeb4347bdd26bfc++6b7ee9a3b755dd, java, c++"),需要提取它们的共同元素作为新特征。Pandas 本身不直接支持字符串集合运算,但可通过 Python 原生 set 与列表推导式高效实现。
以下为完整操作步骤:
✅ 步骤一:构建示例数据
import pandas as pd
data = {
'Col1': ["apple, banana, orange", "dog, cat", "python, java, c++"],
'Col2': ["banana, lemon, blueberry", "bird, cat", "R, fortran"]
}
df = pd.DataFrame(data)✅ 步骤二:计算元素交集并生成 Col3
核心逻辑是:对每行的 Col1 和 Col2 字符串分别
① 用 .split(', ') 拆分为列表;
② 转为 set 类型以支持交集运算(&);
③ 将交集结果用 ', '.join() 合并回字符串;
④ 若交集为空,显式赋值为 pd.NA(推荐做法,保持缺失值语义清晰)。
df['Col3'] = [
', '.join(set(a.split(', ')) & set(b.split(', '))) or pd.NA
for a, b in zip(df['Col1'], df['Col2'])
]? 说明:or pd.NA 是简洁写法,等价于三元表达式 x if x else pd.NA。它确保空字符串(即无交集)被替换为 pd.NA,而非空字符串 "",从而正确参与后续 isna() 判断、统计或可视化。
✅ 输出效果
| Col1 | Col2 | Col3 |
|---|---|---|
| apple, banana, orange | banana, lemon, blueberry | banana |
| dog, cat | bird, cat | cat |
| python, java, c++ | R, fortran |
⚠️ 注意事项
-
空格敏感:split(', ') 要求逗号后紧跟一个空格。若原始数据格式不统一(如 "apple,banana" 或 "apple , cat"),建议先标准化:
df['Col1'] = df['Col1'].str.replace(r'\s*,\s*', ', ', regex=True).str.strip()
-
大小写处理:如需忽略大小写,可在转 set 前统一小写:
set(a.lower().split(', ')) & set(b.lower().split(', ')) - 性能提示:对于超大数据集(百万行以上),可改用 apply + lambda 并启用 vectorize=False,或考虑 swifter 加速;但列表推导式在多数场景下已足够快且内存友好。
该方法轻量、可读性强,无需额外依赖,是 Pandas 文本集合运算的经典实践方案。










