Pandas如何对DataFrame的列表类型列使用searchsorted方法
问题原因与正确实现
报错根因
np.searchsorted的第一个参数要求是一维有序类数组结构。你直接传入存储Python列表的Series时,numpy会将其识别为object类型的一维数组,每个元素本身是一个list,运算时会直接拿整数5和list做大小比较,因此触发类型错误。- 单独传入
test['timestamp'][0]能正常运行,是因为此时传入的是单个一维整数列表,完全符合searchsorted的参数输入要求。
可用实现方案
方案1:逐行调用(逻辑简单,适配所有场景)
使用Series.apply逐行对每个有序列表执行searchsorted,代码直观不容易出错,适合绝大多数数据规模:
import numpy as np import pandas as pd # 构造示例数据 test = pd.DataFrame({ 'timestamp': [ [1, 2, 3, 4], [1, 3, 5, 7], [2, 4, 6, 8], [1, 5, 5, 5], [3, 4, 5, 6] ] }) # 生成结果列 test['res'] = test['timestamp'].apply(lambda lst: np.searchsorted(lst, 5))
运行后输出结果和预期完全一致:
>>> test timestamp res 0 [1, 2, 3, 4] 3 1 [1, 3, 5, 7] 1 2 [2, 4, 6, 8] 2 3 [1, 5, 5, 5] 0 4 [3, 4, 5, 6] 1
方案2:批量运算(适合大数据量,性能更优)
如果DataFrame行数很高,逐行apply循环效率偏低,且所有行的列表长度一致,可以先将列表列转换为二维numpy数组,再批量执行搜索:
# 转换为二维numpy数组 arr = np.array(test['timestamp'].tolist()) # 按行执行searchsorted test['res'] = np.apply_along_axis(lambda row: np.searchsorted(row, 5), axis=1, arr=arr)
提示:如果各行列表长度不统一,无法使用批量方案,只能选择逐行调用的方式。
内容的提问来源于stack exchange,提问作者xmar
相关产品推荐
相关产品推荐

