如何不用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
相关产品推荐
相关产品推荐

