如何从row、col索引列表与val值列表构建任意规模的DataFrame?
如何从行/列索引列表构建指定格式的DataFrame
你可以通过两种灵活的方式实现任意规模的列表到目标DataFrame的转换,以下是具体方案:
方法一:直接构建数组+多级表头(直观可控)
这种方式手动处理数据填充和表头设置,适合需要精细控制输出样式的场景:
import pandas as pd import numpy as np # 输入的三个索引与值列表 row = [0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4] col = [0, 1, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5] val = ['', 'Heading', 'Prio', 'Black', 'USA', 'Inve', 'CAN', 'White', 'Busy', '', '', '', '', '', 'Req', '', '', '', '', '', 'Info', 'X', 'N/A', 'N/A', 'X', 'X'] # 确定数据行和列的范围 max_data_row = max(row) max_col = max(col) # 创建空数组存储数据(跳过row=0的表头行) data = np.full((max_data_row, max_col + 1), '', dtype=object) # 填充数据到对应位置 for r, c, v in zip(row, col, val): if r == 0: continue # 跳过表头行,后续单独处理 data[r-1, c] = v # 构建基础DataFrame df = pd.DataFrame(data) # 构建多级表头,实现"Heading"跨列效果 top_header = [''] + ['Heading'] * 5 df.columns = pd.MultiIndex.from_tuples(zip(top_header, ['']*(max_col+1))) # 输出符合示例样式的表格 print(df.to_markdown(index=True, tablefmt="pipe"))
方法二:长格式转宽格式(自动适配规模)
这种方式利用pandas的透视功能,无需手动计算行列范围,完全适配任意规模的输入:
import pandas as pd # 输入的三个索引与值列表 row = [0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4] col = [0, 1, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5] val = ['', 'Heading', 'Prio', 'Black', 'USA', 'Inve', 'CAN', 'White', 'Busy', '', '', '', '', '', 'Req', '', '', '', '', '', 'Info', 'X', 'N/A', 'N/A', 'X', 'X'] # 转换为长格式DataFrame long_df = pd.DataFrame({'row': row, 'col': col, 'val': val}) # 分离表头和数据部分 header_df = long_df[long_df['row'] == 0].set_index('col')['val'] data_df = long_df[long_df['row'] >= 1].pivot(index='row', columns='col', values='val') # 重置数据行索引为从0开始 data_df.index = data_df.index - 1 # 构建多级表头 top_header = [header_df.get(c, '') for c in data_df.columns] data_df.columns = pd.MultiIndex.from_tuples(zip(top_header, ['']*len(data_df.columns))) # 输出结果 print(data_df.to_markdown(index=True, tablefmt="pipe"))
关键特性
- 两种方法都支持任意长度的输入列表,只要
row、col、val的元素数量一致即可。 - 空值会自动填充为空字符串,与示例中的空白位置匹配。
- 多级表头的设置实现了示例中"Heading"跨列的展示效果,若不需要合并表头,可直接使用基础DataFrame。
内容的提问来源于stack exchange,提问作者DrakeMurdoch
相关产品推荐
相关产品推荐

