如何展平此数据框
Posted
技术标签:
【中文标题】如何展平此数据框【英文标题】:How to flatten this Dataframe 【发布时间】:2021-11-20 11:50:01 【问题描述】:我有由 ID 和一列组成的数据框。该列在每个单元格中都有字典列表。我想要的是对其进行规范化和展平,因此我将拥有许多从这些字典中出现的列,而不是一列。
LoadNodes
SubProjectId
56409 ['Id': 2, 'Description': None, 'Name': None, ...
56410 ['Id': 2, 'Description': None, 'Name': None, ...
56411 ['Id': 2, 'Description': None, 'Name': None, ...
56412 ['Id': 2, 'Description': None, 'Name': None, ...
56414 ['Id': 3, 'Description': None, 'Name': None, ...
... ...
56505 ['Id': 2, 'Description': None, 'Name': None, ...
56506 ['Id': 2, 'Description': None, 'Name': None, ...
56507 ['Id': 2, 'Description': None, 'Name': None, ...
56508 ['Id': 2, 'Description': None, 'Name': None, ...
56509 ['Id': 2, 'Description': None, 'Name': None, ...
87 rows × 1 columns
Dataframe 看起来像这样,我想要的不是列 LoadNodes,而是 Id、Description、Name 等列。当我使用此命令时:
pd.DataFrame(pd.json_normalize(load_only_df['LoadNodes']), index = load_only_df.index)
我收到以下输出...
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
SubProjectId
56409 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56410 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56411 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56412 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56414 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
56505 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56506 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56507 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56508 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56509 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
87 rows × 46 columns
编辑 1: “df = pd.json_normalize(load_only_df['LoadNodes']) 的输出是什么?NaN 的原因是使用 index = load_only_df.index,如果删除它是什么输出? - 耶斯瑞尔 1 分钟前”
这是您发布的命令的输出。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
0 'Id': 2, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
1 'Id': 2, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
2 'Id': 2, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
3 'Id': 2, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
4 'Id': 3, 'Description': None, 'Name': None, '... 'Id': 4, 'Description': None, 'Name': None, '... 'Id': 5, 'Description': None, 'Name': None, '... 'Id': 6, 'Description': None, 'Name': None, '... 'Id': 7, 'Description': None, 'Name': None, '... 'Id': 8, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
82 'Id': 2, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
83 'Id': 2, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
84 'Id': 2, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
85 'Id': 2, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
86 'Id': 2, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
87 rows × 46 columns
【问题讨论】:
df = pd.json_normalize(load_only_df['LoadNodes'])
的输出是什么? NaN
s 的原因是使用index = load_only_df.index
,如果删除它,输出是什么?
我在帖子中添加了编辑。
如果您提供一个创建要重塑的结构的数据框的最小示例,也会更容易。至于解决方案,pandas.pydata.org/pandas-docs/stable/reference/api/… 做你需要的吗?
【参考方案1】:
IIUC 使用Series.explode
:
df = pd.json_normalize(load_only_df['LoadNodes'].explode())
如果重要的还有索引值,这里SubProjectId
使用:
load_only_df = pd.DataFrame('LoadNodes':[['Id': 2, 'Description': None, 'Name': None,
'Id': 7, 'Description': None, 'Name': None,
'Id': 8, 'Description': None, 'Name': None],
['Id': 20, 'Description': None, 'Name': None,
'Id': 71, 'Description': None, 'Name': None,
'Id': 80, 'Description': None, 'Name': None]]
, index=[500, 123])
s = load_only_df['LoadNodes'].explode()
df = pd.json_normalize(s).set_index(s.index)
print(df)
Id Description Name
500 2 None None
500 7 None None
500 8 None None
123 20 None None
123 71 None None
123 80 None None
【讨论】:
以上是关于如何展平此数据框的主要内容,如果未能解决你的问题,请参考以下文章