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

如何在Pandas中高效使用Series.str.slice处理行可变参数?

动态提取每行子串的高效实现方法

你需要根据每行不同的起始位置从字符串列中提取子串,当前使用apply+lambda的逐行方案速度较慢,下面提供两种更高效的替代方案:

方案一:针对分割场景的极简处理(适用于固定分隔符)

如果你的需求本质是按-分割字符串并取后半部分,直接用str.split的向量化操作即可,无需先找分隔符索引:

import pandas as pd
df = pd.DataFrame({'st_col1':['aa-b', 'aaa-b']})
df['fast_sol'] = df['st_col1'].str.split('-').str[1]

这个方法完全基于pandas的向量化字符串操作,比apply快一个数量级以上。

方案二:通用动态起始位置的高效实现

如果是更通用的动态起始位置(不局限于固定分隔符),可以利用numpy的向量化处理替代逐行循环:

方法A:列表推导式(简洁且高效)

str_arr = df['st_col1'].values
start_arr = df['index_dash'].values + 1
df['fast_sol'] = [s[start:] for s, start in zip(str_arr, start_arr)]

方法B:numpy vectorize包装

import numpy as np

def slice_string(s, start_idx):
    return s[start_idx:]

vec_slice = np.vectorize(slice_string)
df['fast_sol'] = vec_slice(df['st_col1'], df['index_dash'] + 1)

为什么原来的apply方案慢?

df.apply(axis=1)本质是逐行遍历DataFrame,属于Python层面的循环;而pandas/numpy的向量化操作是基于底层C语言实现的,在数据量较大时(比如上万行以上),性能差距会非常明显。

另外你提到的Series.str.slice确实无法直接接收Series作为起始参数,因为它的参数只支持标量,所以无法直接实现每行不同的动态切片位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:40:26