pandas中如何对含两个小数点的字符串列高效执行lambda函数
逐行判断需求的最高效实现
优先用pandas向量化字符串操作做筛选,不要用逐行遍历判断,性能差距可达数十倍:
- 首先用
str.count('\.')统计目标列每个字符串的小数点数量,生成布尔掩码 - 用掩码筛选符合条件的行,再运行自定义lambda函数即可
示例代码:
import pandas as pd # 假设目标列名为code # 生成布尔掩码:匹配含2个小数点的元素 mask = df['code'].str.count(r'\.') == 2 # 对符合条件的行执行lambda,这里以拆分双小数点字符串为例 df.loc[mask, 'code'] = df.loc[mask, 'code'].apply(lambda x: f"{x.split('.')[0]}_{x.split('.')[1]}")
该写法为纯向量化筛选,仅对符合条件的元素执行lambda,适合不确定列格式的场景
整列格式统一场景的最优写法
根据你提到的「只要列存在1个双小数点元素,整列都是该格式」的规则,可以仅判断列的第一个非空元素,无需逐行扫描,性能开销最低:
# 取出目标列的非空序列 valid_series = df['code'].dropna() # 仅做一次判断,符合条件就整列执行lambda if not valid_series.empty and valid_series.iloc[0].count('.') == 2: df['code'] = df['code'].apply(lambda x: 你的自定义逻辑)
如果你的lambda逻辑可以替换为pandas原生向量化字符串操作,建议替换,性能还能再提升一个量级,比如拆分双小数点字符串可以直接用str.split实现,不需要用apply:
df[['part1', 'part2', 'part3']] = df['code'].str.split('.', expand=True)
内容的提问来源于stack exchange,提问作者JohnCena1997
相关产品推荐
相关产品推荐

