如何从值为列表的字典创建保留列表结构的pandas DataFrame
问题成因
pd.DataFrame.from_dict 默认会把字典值解析为对应列的逐行数值序列。你传入的每个值是长度为3的三维坐标数组,这种自动拆分行为是pandas为了适配常规“列存储多行同类型数据”的场景设计的,会自动把数组拆分为3行逐元素填充,最终生成的DataFrame仅3行,每个单元格存单个浮点数,和预期结构完全不符。
另外你写出的pose.to_csv("pose.csv"),index=False)存在括号位置错误,会直接触发语法报错。
解决方法
方案1:实现单元格存储完整三维数组的需求
给每个坐标数组外层套一层单元素列表,明确告知pandas“对应列仅包含1行数据,行内容就是传入的完整数组”,从根源上避免数组被自动拆分:
import pandas as pd import numpy as np # 构造符合存储要求的DataFrame pose_df = pd.DataFrame({keypoint: [coords] for keypoint, coords in pose.items()})
结构验证:
# 取出对应关键点的完整坐标,符合预期 print(pose_df["p1_center_head"].iloc[0]) # 输出:[-0.91411722 -1.11261988 1.70305252]
修正语法错误后直接保存即可:
pose_df.to_csv("pose.csv", index=False)
CSV为纯文本格式,写入时三维数组会自动转为带空格的字符串存入对应单元格,不会被拆分为独立列。如果需要将CSV读回为带数组结构的DataFrame,加载时增加字符串转数组的处理逻辑:
def convert_to_array(text): # 去掉字符串两侧的方括号,按空白分割为浮点数数组 return np.array(text.strip("[]").split(), dtype=np.float64) # 读回时自动转换列类型 pose_loaded = pd.read_csv( "pose.csv", converters={col: convert_to_array for col in pose_df.columns} )
方案2:适配数据分析场景的扁平化存储
如果不需要严格在单元格内存完整数组,可将三维坐标拆分为独立列,这种结构更适合后续的批量计算、筛选操作:
# 以关键点名称为行索引,三维坐标拆为x/y/z三列 pose_df_flat = pd.DataFrame.from_dict( pose, orient="index", columns=["x", "y", "z"] ) pose_df_flat.to_csv("pose_flat.csv", index_label="keypoint_name")
两种方案的差异:
- 方案1完全匹配你提出的“单元格存储完整浮点数列表”的需求
- 方案2的CSV结构更通用,后续数据分析效率更高
内容的提问来源于stack exchange,提问作者Kong。
相关产品推荐
相关产品推荐

