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

Python Pandas无循环判断同列值是否为其他行子串并赋值最小值

解决方案

完全不需要显式写循环,用Pandas+Numpy的向量化操作即可实现,性能远高于Python层的循环/遍历方案,具体实现如下:

实现步骤

  1. 首先提取所有去重的字符串及其对应编码,避免重复计算
  2. 构造子串匹配布尔矩阵,向量化完成所有子串匹配判断
  3. 基于匹配矩阵取每行对应的最小编码即可

完整代码

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个数量级:

  1. 先将唯一字符串按长度升序、编码升序排序,短字符串更可能是长字符串的子串,且编码更小的优先匹配
  2. 用numba的JIT编译遍历逻辑,避免Python层循环开销

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:24:03