
本文介绍在 pandas 中高效截取 dataframe 某列(元素为 python 列表)中每行数组的前 n 个元素的方法,适用于嵌套列表结构的数据清洗与特征预处理场景。
当 DataFrame 的某一列(或多个列)存储的是 Python 列表(如 [[1,2,3,4], [2,2,3,3]]),而你需要统一截取每行列表的前 n 个元素时,最简洁、向量化且安全的方式是使用 .str 访问器配合切片操作——尽管列中存储的是列表而非字符串,Pandas 的 .str 访问器对可迭代序列(包括 list、tuple、numpy.ndarray 等)同样支持索引与切片。
✅ 正确做法(推荐):
n = 2 result = df.apply(lambda x: x.str[:n]) print(result)
输出:
a b 0 [1, 2] [6, 7] 1 [2, 2] [6, 6]
⚠️ 注意事项:
- .str[:n] 能安全处理空列表([])、长度不足 n 的列表(自动截取全部,不报错),具有良好的鲁棒性;
- 该方法要求列中所有元素均为可切片的序列类型(如 list, tuple, np.ndarray),若混入 None、标量或不可迭代对象,会触发 AttributeError;
- 若需仅处理特定列(如只处理 'a' 列),可直接作用于单列:df['a'] = df['a'].str[:n];
- 避免使用 df.applymap() 或逐行 for 循环,性能低且易出错。
? 替代方案(显式映射,更直观但略冗长):
df[['a', 'b']] = df[['a', 'b']].applymap(lambda x: x[:n] if isinstance(x, (list, tuple)) else x)
但 applymap 在 Pandas 2.1+ 已弃用,推荐统一使用 .str 访问器。
? 小结:利用 Pandas 对序列类型的 .str 统一接口进行切片,是处理数组型列截断任务的首选方案——简洁、高效、健壮,且天然兼容缺失值与变长数组。










