Pandas高效转换列元素为单元素列表及transform报错解决
高效实现pandas列元素转单元素列表的方案
原有写法报错/失效原因
df['col'].transform('list')报错:pandas内置的'list'别名是聚合逻辑,作用是将整列所有值合并为一个总列表,返回结果长度和原列不匹配,不符合transform要求输入输出长度一致的规则,因此抛出Transform function failed错误。.transform(list)/.apply(list)报错/结果错误:Python内置list()构造函数会将传入的可迭代对象展开,比如list("abc")会返回['a','b','c']而非['abc'];如果传入的是整数、浮点数这类不可迭代标量,会直接抛出类型错误,最终触发Function did not transform报错。- 最初使用的
df['col'].transform(lambda x: [x])逻辑正确,但属于逐行Python函数调用,函数调用开销大,数据量较大时运行速度很慢。
高性能实现方案
优先选择向量化实现,性能比lambda写法高1~2个数量级(十万行以上数据差距尤为明显):
# 性能最优:numpy向量化操作,无Python层循环 df['col'] = df['col'].to_numpy()[..., None].tolist()
代码逻辑说明:先将列转为numpy一维数组,通过[..., None]新增维度将其转换为n行1列的二维数组,最后调用tolist()直接得到每个元素为单元素列表的结果,全程走C层面的向量化计算。
如果觉得numpy写法可读性稍差,可以选择列表推导实现,性能是lambda写法的2~3倍:
# 次优:Python原生列表推导,循环开销远低于pandas apply/transform df['col'] = [[x] for x in df['col']]
注意:不要为了省事直接传入
list构造函数,哪怕调整参数不报错,遇到字符串、元组这类可迭代值时会自动展开,得到的结果不符合预期。
内容的提问来源于stack exchange,提问作者Tanishq Kumar
相关产品推荐
相关产品推荐

