Python Pandas无循环判断同列值是否为其他行子串并赋值最小值
解决方案
完全不需要显式写循环,用Pandas+Numpy的向量化操作即可实现,性能远高于Python层的循环/遍历方案,具体实现如下:
实现步骤
- 首先提取所有去重的字符串及其对应编码,避免重复计算
- 构造子串匹配布尔矩阵,向量化完成所有子串匹配判断
- 基于匹配矩阵取每行对应的最小编码即可
完整代码
import pandas as pd import numpy as np # 构造示例数据 df = pd.DataFrame({ 'RCS_D': ['GRANITE', 'CHALK', 'GRANITE', 'SCHIST', 'MICROGRANITE', 'SCHIST', 'METACHALK'], 'RCS_enc': [1, 2, 1, 3, 4, 3, 5] }) # 提取去重字符串和对应编码 unique_df = df.drop_duplicates('RCS_D') unique_strs = unique_df['RCS_D'].tolist() unique_encs = unique_df['RCS_enc'].tolist() # 向量化构造子串匹配掩码矩阵:行对应原df每行,列对应每个唯一字符串,值为True表示列字符串是行字符串的子串 match_mask = np.array([df['RCS_D'].str.contains(t) for t in unique_strs]).T # 将掩码矩阵替换为对应编码,0值替换为无穷大后取每行最小值即为结果 df['RCS_min'] = pd.DataFrame(match_mask * unique_encs, index=df.index).replace(0, np.inf).min(axis=1).astype(int)
运行后得到的df和你给出的期望输出完全一致。
极端大数据量优化方案
如果你的数据量超过10万行、且唯一字符串数量较多,上述向量化方案可能占用较多内存,此时可以用预排序+numba加速的方案,性能可以再提升1-2个数量级:
- 先将唯一字符串按长度升序、编码升序排序,短字符串更可能是长字符串的子串,且编码更小的优先匹配
- 用numba的JIT编译遍历逻辑,避免Python层循环开销
内容的提问来源于stack exchange,提问作者WHaMitch
相关产品推荐
相关产品推荐

