如何从嵌套列表快速构建指定格式的Pandas DataFrame?
当然有更简洁的实现方式!咱们可以利用 Pandas 和 NumPy 的内置函数来避免手动构造 id 列和复杂的嵌套列表推导,代码会更紧凑、易读,扩展性也更强。下面给你两种常用的优化方案:
方案一:借助 NumPy 数组重塑 + Pandas 多索引生成
这种方法适合处理规则的嵌套数组,利用 NumPy 的数组操作快速提取目标列,再用 Pandas 自动生成 id 组合:
import pandas as pd import numpy as np a = [[[12,23],[31,41]], [[53,68],[77,87]]] arr = np.array(a) # 按列优先的方式提取并展平c2、c3列数据 c2 = arr[:, 0, :].flatten(order='F') c3 = arr[:, 1, :].flatten(order='F') # 自动生成id1和id2的所有组合 id_pairs = pd.MultiIndex.from_product([[1,2], [1,2]], names=['id1', 'id2']) # 直接构造目标DataFrame df = pd.DataFrame({'id1': id_pairs.get_level_values(0), 'id2': id_pairs.get_level_values(1), 'c2': c2, 'c3': c3})
方案二:利用 Pandas 的多层索引与重塑操作
如果更习惯纯 Pandas 操作,可以通过构造多层索引的 DataFrame,再用 stack/unstack 完成结构转换:
import pandas as pd a = [[[12,23],[31,41]], [[53,68],[77,87]]] # 先基于原始嵌套结构构造多层索引的DataFrame df = pd.DataFrame(a, index=[1,2], columns=[1,2]) # 展开每个单元格的列表、调整索引结构,最后重命名列 df = (df.apply(pd.Series.stack) .unstack(level=1) .reset_index() .rename(columns={'level_0': 'id1', 0: 'id2', 1: 'c2', 2: 'c3'}))
为什么这两种方案更优?
和你原来的实现相比,它们:
- 不需要手动硬编码 id 列的列表(比如
[1,1,2,2]),当嵌套规模变化时,只需调整索引的范围即可 - 避免了嵌套列表推导的可读性问题,逻辑更直观
- 利用库的内置函数处理数据转换,性能更稳定
内容的提问来源于stack exchange,提问作者HappyPy
相关产品推荐
相关产品推荐

