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

如何不用apply逐行检查DataFrame指定列是否含目标字符串?

更Pythonic的Pandas列子集字符串匹配实现

需求:检查DataFrame的指定列子集内,是否存在任意一列包含目标字符串列表中的任一字符串。已通过apply实现需求,现寻求更符合Python风格的替代方案。

原始实现及输出

示例数据

import pandas as pd

df = pd.DataFrame({'col1': ['cat', 'dog', 'mouse'],
                   'col2': ['car', 'bike', '']})

自定义函数+apply实现

def check_data(df_row, cols, strings):
    for j in cols:
        if df_row[j] in strings:
            return 1
    return 0

# 单列匹配
df['answer'] = df.apply(check_data, cols=['col1'], strings=['dog', 'cat'], axis=1)

输出:

col1  col2  answer
0   cat   car       1
1   dog  bike       1
2  mouse           0
# 多列匹配
df['answer'] = df.apply(check_data, cols=['col1', 'col2'], strings=['bike', 'mouse'], axis=1)

输出:

col1  col2  answer
0   cat   car       0
1   dog  bike       1
2  mouse           1

更Pythonic的向量化实现

利用Pandas原生的向量化操作替代逐行循环,代码更简洁且效率更高:

单列场景

直接使用isin()生成布尔序列,再转为整数:

df['answer'] = df['col1'].isin(['dog', 'cat']).astype(int)

多列场景

先通过isin()生成布尔矩阵,再用any(axis=1)判断每行是否存在匹配项,最后转为整数:

cols = ['col1', 'col2']
strings = ['bike', 'mouse']
df['answer'] = df[cols].isin(strings).any(axis=1).astype(int)

核心优势

  • 效率更高:向量化操作避免了apply的逐行循环,处理大数据集时性能提升明显
  • 代码简洁:无需自定义函数,一行代码完成需求
  • 可读性强:符合Pandas惯用写法,逻辑清晰直观

内容的提问来源于stack exchange,提问作者Sjoseph

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:15:44