如何在Python中将DataFrame内的字典嵌套列表转为键表头表格
问题:如何将嵌套字典列表展开为结构化DataFrame?
我已有如下数据:
results df = pd.DataFrame(results) df
输出结果:
results: farm_power_output farm_unwaked_power_output farm_wind_direction flow_case_id id measurement_set_id met_mast_results simulation_id timestamp turbine_results 0 80348100.0 81027200.0 2.63545 00001WS11.6dir151.0 34875 None [{'air_density': 1.20526, 'id': 28962, 'instan... 3zznris223wxkeimi9jrkg2n None [{'air_density': 1.20526, 'id': 631357, 'insta... 1 80200300.0 81226300.0 3.14159 00008WS11.7dir180.0 34876 None [{'air_density': 1.20526, 'id': 28963, 'instan... 3zznris223wxkeimi9jrkg2n None [{'air_density': 1.20526, 'id': 631369, 'insta... 2 62370800.0 67676300.0 3.03687 00006WS10.1dir174.0 34877 None [{'air_density': 1.20526, 'id': 28964, 'instan... 3zznris223wxkeimi9jrkg2n None [{'air_density': 1.20526, 'id': 631381, 'insta... 3 40375100.0 43515300.0 2.56563 00000WS8.6dir147.0 34878 None [{'air_density': 1.20526, 'id': 28965, 'instan... 3zznris223wxkeimi9jrkg2n None [{'air_density': 1.20526, 'id': 631393, 'insta... 4 79935100.0 81509900.0 2.82743 00004WS12.4dir162.0 34879 None [{'air_density': 1.20526, 'id': 28966, 'instan... 3zznris223wxkeimi9jrkg2n None [{'air_density': 1.20526, 'id': 631405, 'insta... 5 73799100.0 77291300.0 3.10669 00007WS10.8dir178.0 34880 None [{'air_density': 1.20526, 'id': 28967, 'instan... 3zznris223wxkeimi9jrkg2n None [{'air_density': 1.20526, 'id': 631417, 'insta... 6 81055200.0 81348000.0 2.70526 00003WS12.0dir155.0 34881 None [{'air_density': 1.20526, 'id': 28968, 'instan... 3zznris223wxkeimi9jrkg2n None [{'air_density': 1.20526, 'id': 631429, 'insta... 7 54173400.0 66155700.0 2.89725 00005WS10.0dir166.0 34882 None [{'air_density': 1.20526, 'id': 28969, 'instan... 3zznris223wxkeimi9jrkg2n None [{'air_density': 1.20526, 'id': 631441, 'insta... 8 71949100.0 74568800.0 2.67035 00002WS10.6dir153.0 34883 None [{'air_density': 1.20526, 'id': 28970, 'instan... 3zznris223wxkeimi9jrkg2n None [{'air_density': 1.20526, 'id': 631453, 'insta...
我执行了以下代码:
df1 = df.turbine_results df1
得到如下结果:
df1 : 0 [{'air_density': 1.20526, 'id': 631357, 'insta... 1 [{'air_density': 1.20526, 'id': 631369, 'insta... 2 [{'air_density': 1.20526, 'id': 631381, 'insta... 3 [{'air_density': 1.20526, 'id': 631393, 'insta... 4 [{'air_density': 1.20526, 'id': 631405, 'insta... 5 [{'air_density': 1.20526, 'id': 631417, 'insta... 6 [{'air_density': 1.20526, 'id': 631429, 'insta... 7 [{'air_density': 1.20526, 'id': 631441, 'insta... 8 [{'air_density': 1.20526, 'id': 631453, 'insta... Name: turbine_results, dtype: object
但我期望得到如下格式的表格:
turbine_results : air_density id instance_id power rotor_wind_speed turbulence_intensity unwked_power wake_speed_factor 1.20526 631357 3 6752270.0 11.5226 0.1 6752270.0 1.0 1.20526 631358 6 6751830.0 11.5196 0.2 6752270.0 0.999739 1.20526 631369 3 6768860.0 11.6919 0.3 6768860.0 1.0 1.20526 631370 2 6768600.0 11.6877 0.4 6768600.0 0.99645 1.20526 631381 3 5639690.0 10.0387 0.5 5639690.0 1.0 1.20526 631382 2 5658480.0 10.0382 0.6 5658480.0 0.999954 1.20526 631393 3 3626270.0 8.53487 0.7 3626270.0 1.0 1.20526 631394 6 3628910.0 8.53459 0.8 3628910.0 0.99967 1.20526 631405 3 6792490.0 12.3093 0.9 6792490.0 1.0
请问如何实现将该字典嵌套列表展开为以键名为表头的结构化表格?
解决方案
方法一:使用explode + json_normalize
先将turbine_results列中的列表展开为多行,再将每行的字典解析为结构化列:
# 展开列表为多行 exploded_df = df.explode('turbine_results') # 解析字典为结构化DataFrame turbine_df = pd.json_normalize(exploded_df['turbine_results']) # 查看结果 print(turbine_df)
如果需要保留原DataFrame的其他列,可以合并数据:
final_df = pd.concat([exploded_df.drop('turbine_results', axis=1), turbine_df], axis=1)
方法二:使用列表推导式直接收集所有字典
遍历所有行的turbine_results列表,收集所有嵌套字典后转为DataFrame:
# 收集所有嵌套字典数据 all_turbine_data = [item for sublist in df['turbine_results'] for item in sublist] # 转为结构化DataFrame turbine_df = pd.DataFrame(all_turbine_data) # 查看结果 print(turbine_df)
两种方法都能生成你期望的结构化表格,可根据是否需要保留原表其他列选择对应方法。
内容的提问来源于stack exchange,提问作者PJPATEL
相关产品推荐
相关产品推荐

