如何将DataFrame中各列表类型元素替换为对应列表的第二个元素
实现方案
针对全为列表元素的DataFrame,无显式Python层循环的高性能实现方式如下,核心借助numpy向量化操作,所有运算在C层完成,性能远高于逐元素apply写法:
import pandas as pd import numpy as np # 构造测试数据 df = pd.DataFrame({'a':[[1,7],[0,5]],'b':[[3,1],[4,0]],'c':[[1,4],[2,0]]}) # 提取每个列表第二个元素(索引为1) result = pd.DataFrame( np.array(df.to_numpy().tolist())[:, :, 1], columns=df.columns )
实现逻辑说明
- 首先通过
df.to_numpy().tolist()将原DataFrame转换为二维嵌套列表,结构为[行][列] = 原单元格列表 - 嵌套列表传入
np.array()后会生成形状为(行数, 列数, 单列表长度)的三维numpy数组 - 索引
[:, :, 1]表示选取所有行、所有列下,每个列表索引为1的元素(Python索引从0开始,对应第二个元素) - 最后将提取到的二维数组重新封装为DataFrame,保留原列名即可
结果验证
运行代码后输出的result完全符合预期:
a b c 0 7 1 4 1 5 0 0
常见误区说明
replace方法仅支持值匹配替换,无法直接提取列表内部元素,不适用该场景- 基于
apply/applymap+ lambda的写法本质是Python层逐元素循环,数据量较大时运行耗时高,不符合性能要求 - 该方法要求所有单元格内的列表长度至少为2,否则会触发索引越界错误,使用前建议先做数据合法性校验
内容的提问来源于stack exchange,提问作者currently_into_ai
相关产品推荐
相关产品推荐

