Python Pandas按指定列的起止位置拆分字符串列的问题
解决按列指定位置拆分字符串的问题
嗨,这个问题我之前也碰到过!先给你解释下为什么直接用df1['strings'].str[df1['start']:df1['end']]会返回NaN——因为str[]切片语法只支持传入标量值,当你把整个start/end列(Series对象)传进去时,pandas没办法自动逐行匹配对应位置的参数,所以就返回了缺失值。
下面给你几个更优雅、高效的解决方案,比列表推导式更贴合pandas的使用习惯:
方案一:用apply逐行处理(简洁直观)
这是最符合pandas风格的写法,直接按行遍历DataFrame,每一行用对应的start和end值切片字符串:
df1['sliced_strings'] = df1.apply(lambda row: row['strings'][row['start']:row['end']], axis=1)
执行后你的DataFrame会新增一列sliced_strings,结果就是你预期的['ckov', 'kexch']。
方案二:用numpy向量化函数(性能最优)
如果你的数据集很大,apply的速度可能不够快,这时候可以用numpy.vectorize把普通切片函数转化为向量化操作,效率会提升很多:
import numpy as np # 定义一个普通的切片函数 def slice_string(s, start, end): return s[start:end] # 转化为向量化函数 vectorized_slice = np.vectorize(slice_string) # 应用到DataFrame上 df1['sliced_strings'] = vectorized_slice(df1['strings'], df1['start'], df1['end'])
向量化操作是numpy的强项,处理几十万甚至上百万行数据时,速度会比apply快好几倍。
方案对比
- 你原来的列表推导式虽然能得到结果,但需要手动把结果转为Series再赋值给DataFrame,可读性和维护性不如上面两种方案;
apply写法简洁,适合中小数据集;- numpy向量化函数适合大数据集,性能优势明显。
内容的提问来源于stack exchange,提问作者haven
相关产品推荐
相关产品推荐

