逐步将带有 json 的列表规范化为数据框

Normalize a list with jsons to a dataframe in steps

我有问题。我有一个 listJSONs。我想分步创建一个完整的数据框。例如,我的想法是:我的列表包含 100 个元素。我想说步长应该是25。所以我说len(list) / size = 4 = 100 / 25。我有 4 个 运行 的 for 循环和 4 次将小数据帧连接到完整。对于 MVP,我构建了一个列表,其中包含 4 个元素,步长为 2。因此每个循环都应该联系两个元素。

最后我的 dataframe_complete 只包含两行。这有什么问题?

第一个循环应包含 my_Dictmy_Dict2,第二个循环应包含 my_Dict2my_Dict2。所以列表应该从 0-1 到 2-3。所以每个循环 运行 应该包含两个元素。

import pandas as pd

my_Dict = {
'_key': '1',
 'group': 'test',
 'data': {},
 'type': '',
 'code': '007',
 'conType': '1',
 'flag': None,
 'createdAt': '2021',
 'currency': 'EUR',
 'detail': {
        'selector': {
            'number': '12312',
            'isTrue': True,
            'requirements': [{
                'type': 'customer',
                'requirement': '1'}]
            }
        }   
 }

my_Dict2 = {
'_key': '2',
 'group': 'test',
 'data2': {},
 'type': '',
 'code': '007',
 'conType': '1',
 'flag': None,
 'createdAt': '2021',
 'currency': 'EUR',
 'detail2': {
        'selector': {
            'number': '12312',
            'isTrue': True,
            'requirements': [{
                'type': 'customer',
                'requirement': '1'}]
            }
        }   
 }
list_dictionaries = [my_Dict, my_Dict2, my_Dict2, my_Dict2]

df_complete = pd.DataFrame()

size= 1
for i in range((len(list_dictionaries) // size)):
    print(i)
    df = pd.json_normalize(list_dictionaries[i], sep='_')
    df_complete= pd.concat([df_complete, df])

print(df_complete)

[OUT]

    _key    group   type    code    conType flag    createdAt   currency    detail_selector_number  detail_selector_isTrue  detail_selector_requirements    detail2_selector_number detail2_selector_isTrue detail2_selector_requirements
0   1   test        007 1   None    2021    EUR 12312   True    [{'type': 'customer', 'requirement': '1'}]  NaN NaN NaN
0   2   test        007 1   None    2021    EUR NaN NaN NaN 12312   True    [{'type': 'customer', 'requirement': '1'}]

预期输出

    _key    group   type    code    conType flag    createdAt   currency    detail_selector_number  detail_selector_isTrue  detail_selector_requirements    detail2_selector_number detail2_selector_isTrue detail2_selector_requirements
0   1   test        007 1   None    2021    EUR 12312   True    [{'type': 'customer', 'requirement': '1'}]  NaN NaN NaN
1   2   test        007 1   None    2021    EUR NaN NaN NaN 12312   True    [{'type': 'customer', 'requirement': '1'}]
2   2   test        007 1   None    2021    EUR NaN NaN NaN 12312   True    [{'type': 'customer', 'requirement': '1'}]
3   2   test        007 1   None    2021    EUR NaN NaN NaN 12312   True    [{'type': 'customer', 'requirement': '1'}]

最有可能出现的问题是,在第一次迭代时,空数据帧是 obtained.Since,使用了 list_dictionaries[:0] 切片。试试下面的代码。

list_dictionaries = [my_Dict, my_Dict2, my_Dict2, my_Dict2]
df_complete = pd.DataFrame()

for i in range(0, len(list_dictionaries)):
    df = pd.json_normalize(list_dictionaries[i], sep='_')
    df_complete = pd.concat([df_complete, df])


print(df_complete.reset_index())

这是你需要的吗?

如果每次迭代都需要两个字典:

for i in range(0, len(list_dictionaries), 2):
    print(list_dictionaries[i:i+2])

如果你想在两次迭代中连接所有归一化帧。

for i in range(0, len(list_dictionaries), 2):
    df1 = pd.json_normalize(list_dictionaries[i], sep='_')
    df2 = pd.json_normalize(list_dictionaries[i+1], sep='_')
    df_complete = pd.concat([df_complete, df1, df2])

df_complete = df_complete.reset_index()
print(df_complete)

或者一般来说,以免在'list_dictionaries'中创建不必要的四个字典。 有必要在每次迭代时在循环中传递必要元素的列表,并从 them.The 中获取索引,第一次迭代是 first 和 second[0, 1] 字典,第二次是 second[1, 1]词典。

list_dictionaries = [my_Dict, my_Dict2]
df_complete = pd.DataFrame()
for i in [[0, 1], [1, 1]]:
    df1 = pd.json_normalize(list_dictionaries[i[0]], sep='_')
    df2 = pd.json_normalize(list_dictionaries[i[1]], sep='_')
    df_complete = pd.concat([df_complete, df1, df2])

df_complete = df_complete.reset_index()