如何用pandas.str基于同DataFrame起止列对列表列做向量化切片
pandas列存储列表时按行动态切片实现方案
问题场景
需要对值为列表类型的pandas列执行逐行切片操作,切片的起始、终止索引分别取自同一DataFrame中对应行的start、stop整型列,直接调用df['column_with_list_values'].str[start:stop]无法得到逐行对应切片的预期结果。
示例测试数据:
import pandas as pd df = pd.DataFrame({ 'list_values': [ [5,7,6,8], [1,3,5,7,2,4,6,8], [1,3,5,7,2,4,6,8], [1,3,5,7,2,4,6,8], [1,3,5,7,2,4,6,8], [1,3,5,7,2,4,6,8], [1,3,5,7,2,4,6,8] ], 'start': [0,1,0,0,1,2,0], 'stop': [2,3,2,2,3,4,2] })
预期输出结果:
0 [5, 7] 1 [3, 5] 2 [1, 3] 3 [1, 3] 4 [3, 5] 5 [5, 7] 6 [1, 3]
错误原因
.str访问器的切片操作仅支持传入固定的全局起止值,无法接收逐行变化的Series类型作为切片参数,因此无法实现行级动态切片的需求。
实现方法
- 推荐方案:列表推导式(性能最优,写法简洁)
直接通过zip逐行取出列表、起始索引、终止索引做原生列表切片,是这类操作速度最快的实现方式:df['sliced'] = [lst[s:e] for lst, s, e in zip(df['list_values'], df['start'], df['stop'])] - 备选方案:
apply逐行处理(可读性强但性能稍弱)
如果更倾向于用pandas原生方法,可以用apply指定按行遍历处理:df['sliced'] = df.apply(lambda x: x['list_values'][x['start']:x['stop']], axis=1)
补充说明
.str访问器最初是为字符串类型的向量化操作设计的,虽然对列表这类对象类型列也兼容部分基础索引、切片操作,但不支持动态行级参数传入,这类需要逐行取不同参数的操作,优先选择列表推导式即可。
内容的提问来源于stack exchange,提问作者Ivan Stimac
相关产品推荐
相关产品推荐

