如何将嵌套的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  

【讨论】:

我想对于通用解决方案,您的代码可以放在接受 dfcolumn_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结构转换为数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何将嵌套的json转换为数据框[重复]

如何将熊猫数据框转换为嵌套的 json

Spark 数据框将嵌套的 JSON 转换为单独的列

如何展平多个嵌套的 json 并转换为数据框?

如何将此嵌套的 JSON 以柱状形式转换为 Pandas 数据框

如何将嵌套的 txt/json 转换为 R 中的“正确”数据框