
本文介绍如何高效地对 pandas dataframe 中存储为 python 列表(数组)的列,按行截取每个列表的前 n 个元素,适用于处理嵌套结构数据。
在 Pandas 中,当某列的每个单元格存储的是 Python 列表(如 [[1,2,3,4], [2,2,3,3]]),直接使用 .str 访问器看似“不适用”(因列表非字符串),但 Pandas 实际为 可迭代对象序列(如 list、tuple、numpy.ndarray)提供了统一的 .str 接口支持——只要元素支持切片操作(__getitem__),.str[:n] 即可安全调用。
因此,最简洁、向量化且推荐的方法是:
n = 2 df_trimmed = df.apply(lambda x: x.str[:n])
✅ 优势:
- 无需显式循环或 map();
- 自动广播到所有列(若需指定列,可用 df[['a','b']].apply(...));
- 兼容 None、NaN 值(自动返回 NaN,不报错);
- 支持任意可切片类型(list, tuple, np.ndarray, str 等)。
⚠️ 注意事项:
- 若列中混有非可切片类型(如 int 或 dict),会触发 AttributeError;建议先校验数据类型:df['a'].apply(type).unique();
- 若需原地修改,可赋值回原 DataFrame:df = df.apply(lambda x: x.str[:n]);
- 对于超大数据集,apply + str 仍为纯 Python 层操作,性能优于 map,但弱于完全向量化方案(如转为 pd.Series 后用 explode + groupby().head(n),但更复杂且内存开销大)。
示例完整运行:
import pandas as pd
df = pd.DataFrame({'a': [[1, 2, 3, 4], [2, 2, 3, 3]], 'b': [[6, 7, 8, 9], [6, 6, 9, 9]]})
n = 2
result = df.apply(lambda x: x.str[:n])
print(result)
# a b
# 0 [1, 2] [6, 7]
# 1 [2, 2] [6, 6]总结:利用 Pandas 内置的 .str 访问器处理数组列切片,是语义清晰、代码简短、健壮性高的标准解法。










