如何将嵌套的json结构转换为数据框
Posted
技术标签:
【中文标题】如何将嵌套的json结构转换为数据框【英文标题】:How to convert nested json structure to dataframe 【发布时间】:2020-03-07 03:01:55 【问题描述】:我将 JSON 转换为 DataFrame
并最终得到一个具有以下值的列“Structure_value”作为字典/字典列表:
Structure_value
['Room': 6, 'Length': 7, 'Room': 6, 'Length': 7]
['Room': 6, 'Length': 22]
['Room': 6, 'Length': 8, 'Room': 6, 'Length': 9]
因为它是一个对象,所以我猜它以这种格式结束。
我需要把它分成以下四列:
Structure_value_room_1 结构值长度_1 Structure_value_room_2 结构值长度_2
*** 上的所有其他解决方案仅处理将 Simple JSON 转换为 DataFrame 而不是嵌套结构。
P.S.:我知道我可以通过显式命名字段来做一些事情,但我需要一个通用的解决方案,以便将来可以处理任何这种格式的 JSON
[编辑]:输出应如下所示:
Structure_value_room_1 Structure_value_length_1 Structure_value_room_2 \
0 6 7 6.0
1 6 22 NaN
2 6 8 6.0
Structure_value_length_2
0 7.0
1 NaN
2 9.0
【问题讨论】:
你能用例子来编辑你的问题吗,你的数据框在给定的输入下应该是什么样子? @music_junkie 我已经编辑了问题,现在你可以看到输出应该是什么样子了。 【参考方案1】:将列表推导与嵌套字典推导一起使用,并枚举字典的重复键,最后将字典列表传递给DataFrame
构造函数:
L = [ f"k_i": v for i, y in enumerate(x, 1)
for k, v in y.items()
for x in df["Structure_value"] ]
df = pd.DataFrame(L)
print(df)
Room_1 Length_1 Room_2 Length_2
0 6 7 6.0 7.0
1 6 22 NaN NaN
2 6 8 6.0 9.0
对于来自问题的列名,请使用:
def json_to_df(df, column):
L = [ f"column_k.lower()_i": v for i, y in enumerate(x, 1)
for k, v in y.items()
for x in df[column] ]
return pd.DataFrame(L)
df1 = json_to_df(df, 'Structure_value')
print(df1)
Structure_value_room_1 Structure_value_length_1 Structure_value_room_2 \
0 6 7 6.0
1 6 22 NaN
2 6 8 6.0
Structure_value_length_2
0 7.0
1 NaN
2 9.0
【讨论】:
我想对于通用解决方案,您的代码可以放在接受df
和 column_name
作为输入的函数中,它适用于所有此类情况..对吗??
这是将所有内容放在一个列表理解中的好方法。荣誉..!
谢谢,@jezrael 正是我正在寻找的解决方案。
@jezrael 我已经编辑了问题 [编辑 2]。我陷入了上述情况。你能帮忙看看如何获得输出吗?
@IceBurger - 你能创建新问题吗?【参考方案2】:
您可能可以将非 Pandas 解决方案应用于原始 JSON 数据,此处由 rows
表示:
import pprint
rows = [
"Foo": "1", "Structure": ['Room': 6, 'Length': 7, 'Room': 6, 'Length': 7],
"Foo": "2", "Structure": ['Room': 6, 'Length': 22],
"Foo": "3", "Structure": ['Room': 6, 'Length': 8, 'Room': 6, 'Length': 9],
]
for row in rows: # Modifies `rows` in-place
for index, room_info in enumerate(row.pop("Structure", ()), 1):
for key, value in room_info.items():
row[f"Structure_value_key.lower()_index"] = value
pprint.pprint(rows)
输出
['Foo': '1',
'Structure_value_length_1': 7,
'Structure_value_length_2': 7,
'Structure_value_room_1': 6,
'Structure_value_room_2': 6,
'Foo': '2', 'Structure_value_length_1': 22, 'Structure_value_room_1': 6,
'Foo': '3',
'Structure_value_length_1': 8,
'Structure_value_length_2': 9,
'Structure_value_room_1': 6,
'Structure_value_room_2': 6]
【讨论】:
以上是关于如何将嵌套的json结构转换为数据框的主要内容,如果未能解决你的问题,请参考以下文章