如何将嵌套的JSON结构转换为数据框架(DataFrame)

3

我将一个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
Structure_value_length_1
Structure_value_room_2
Structure_value_length_2

StackOverflow上的所有其他解决方案都只涉及将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
@music_junkie 我已经编辑了问题,现在你可以看到输出应该是什么样子的。 - IceBurger
2个回答

4

使用带有嵌套字典推导和枚举的列表推导来去除字典键的重复,然后将字典的列表传递给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  

3
我猜想为了得到一个通用的解决方案,您可以将您的代码放在一个函数中,并接受 dfcolumn_name 作为输入,这样就可以适用于所有类似的情况了……对吗? - Faiz Kidwai
1
这是将所有东西放入一个列表推导式的好方法。赞..! - Sajjad Manal
2
谢谢,@jezrael,这正是我在寻找的解决方案。 - IceBurger
@jezrael,我已经编辑了问题[编辑2]。我在提到的情况下卡住了。您能否帮助我如何获得输出? - IceBurger
@IceBurger - 你能创建一个新问题吗? - jezrael
@jezrael 请看这里,https://stackoverflow.com/questions/58948975/how-to-convert-nested-json-structure-having-varying-list-to-dataframe - IceBurger

0

一个非 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}]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接