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

如何在Pandas/Dask的DataFrame或GroupBy对象中逐元素应用str.contains?

Pandas与Dask中逐元素str.contains()的实现方法

一、Pandas DataFrame中的逐元素匹配

直接用df['superstring'].str.contains(df['substring'])会报错,因为原生str.contains()默认把右侧当成单个全局字符串,不支持逐行对应匹配。可以用以下几种方法解决:

  • 逐行apply处理(适合小数据集)
import pandas as pd

# 示例数据
df = pd.DataFrame({
    'superstring': ['apple pie', 'banana bread', 'cherry tart'],
    'substring': ['pie', 'apple', 'cherry']
})

# 逐行检查子串是否在母串中
df['contains'] = df.apply(lambda row: row['substring'] in row['superstring'], axis=1)
  • 向量化处理(中等数据集更高效)
    用numpy.vectorize封装逐元素判断逻辑,比apply速度更快:
import numpy as np

contains_check = np.vectorize(lambda s, sub: sub in s)
df['contains'] = contains_check(df['superstring'], df['substring'])
  • 正则匹配场景(支持正则表达式)
    如果需要用正则规则做逐元素匹配,直接用列表推导式处理:
# 支持正则的版本,比如忽略大小写
df['contains'] = [pd.Series(s).str.contains(sub, case=False).iloc[0] for s, sub in zip(df['superstring'], df['substring'])]

二、Pandas GroupBy对象中的逐元素匹配

如果需要按分组执行逐元素匹配,比如每个组内单独检查对应行的子串是否在母串中,可以结合分组和上述DataFrame的方法:

# 带分组列的示例数据
df = pd.DataFrame({
    'group': ['A', 'A', 'B', 'B'],
    'superstring': ['apple pie', 'banana bread', 'cherry tart', 'date cake'],
    'substring': ['pie', 'banana', 'cherry', 'cake']
})

# 分组后执行逐元素检查
def group_check_contains(group):
    group['contains'] = group.apply(lambda row: row['substring'] in row['superstring'], axis=1)
    return group

df = df.groupby('group').apply(group_check_contains).reset_index(drop=True)

三、Dask DataFrame中的逐元素匹配

Dask需要结合分区处理逻辑,尽量用map_partitions来适配并行计算:

import dask.dataframe as dd

# 把Pandas DataFrame转为Dask DataFrame
dask_df = dd.from_pandas(df, npartitions=2)

# 定义分区内的处理函数
def partition_check_contains(df_part):
    df_part['contains'] = df_part.apply(lambda row: row['substring'] in row['superstring'], axis=1)
    return df_part

# 应用到每个分区
dask_df = dask_df.map_partitions(partition_check_contains)
# 触发计算得到结果
result_df = dask_df.compute()

也可以直接用Dask的apply方法(注意指定meta参数来定义返回列的类型):

dask_df['contains'] = dask_df.apply(
    lambda row: row['substring'] in row['superstring'],
    axis=1,
    meta=('contains', bool)
)
result_df = dask_df.compute()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:10:38