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

