Pandas多行场景下用列值作为另一列字符串切片的实现方法
问题原因
pandas的.str字符串访问器的切片语法仅支持传入固定标量作为统一切片参数,无法直接传入同长度的序列实现逐行动态切片。
- 单行场景下
.item()可以从长度为1的Series中提取出单个Python标量作为固定切片值,因此可以正常运行 - 多行场景下
.item()无法从长度大于1的序列中提取单个标量,因此抛出can only convert an array of size 1 to a Python scalar报错 - 直接传入
.values、.items()返回的对象时,pandas无法将其识别为逐行对应的切片参数,会返回全NaN结果
可行方案
方案1:列表推导式(性能最优,推荐)
直接逐行配对Name列的字符串和Number列的切片值,做原生Python切片,运行效率最高,适合任意数据量场景:
import pandas as pd # 构造测试数据 data = pd.DataFrame( data = { 'Name':['This is a title', 'This is another title'], 'Number':[-5, -13] } ) # 逐行动态切片生成新列 data['Test'] = [s[:n] for s, n in zip(data['Name'], data['Number'])]
运行结果:
Name Number Test 0 This is a title -5 This is a 1 This is another title -13 This is a
方案2:apply逐行处理
按行轴遍历DataFrame,每行取对应字段做切片,代码写法更直观,但性能弱于列表推导式,不适合超大数据量场景:
data['Test'] = data.apply(lambda row: row['Name'][:row['Number']], axis=1)
注意:pandas当前版本的字符串访问器不支持给
.str[:]传入Series/数组类型参数实现逐行动态传参切片,不要直接传列对象调用该接口。
内容的提问来源于stack exchange,提问作者bobby_pine
相关产品推荐
相关产品推荐

