首页 > 解决方案 > 如何使用 json_normalize() 进行迭代?

问题描述

   match_files = []
        for x in glob.glob(r'path\**\*.json', recursive=True):
        match_files.append(x)

with open (match_files[0],encoding ='utf8') as fh:
            mat = json.load(fh)

这是我的数据,它是一个列表:

[{'id': 1816, 'name': 'Constantin Gâlcă', 'nickname': None, 'dob': '1972-03-08', 'country': {'id': 187, 'name': 'Romania'}}]
[{'id': 793, 'name': 'Luis Enrique Martínez García', 'nickname': 'Luis Enrique', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 230, 'name': 'Diego Pablo Simeone', 'nickname': None, 'dob': None, 'country': {'id': 11, 'name': 'Argentina'}}]
[{'id': 238, 'name': 'Enrique Setién Solar', 'nickname': 'Quique Setién', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 793, 'name': 'Luis Enrique Martínez García', 'nickname': 'Luis Enrique', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 793, 'name': 'Luis Enrique Martínez García', 'nickname': 'Luis Enrique', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
nan
[{'id': 793, 'name': 'Luis Enrique Martínez García', 'nickname': 'Luis Enrique', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 793, 'name': 'Luis Enrique Martínez García', 'nickname': 'Luis Enrique', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
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
nan
nan
nan
nan
[{'id': 238, 'name': 'Enrique Setién Solar', 'nickname': 'Quique Setién', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 25, 'name': 'Santiago Hernán Solari Poggio', 'nickname': None, 'dob': '1976-10-07', 'country': {'id': 11, 'name': 'Argentina'}}]
[{'id': 227, 'name': 'Ernesto Valverde Tejedor', 'nickname': 'Ernesto Valverde', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 227, 'name': 'Ernesto Valverde Tejedor', 'nickname': 'Ernesto Valverde', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 229, 'name': 'Eusebio Sacristán Mena', 'nickname': 'Eusebio Sacristán', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 227, 'name': 'Ernesto Valverde Tejedor', 'nickname': 'Ernesto Valverde', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 677, 'name': 'Joan Francesc Ferrer Sicilia', 'nickname': 'Rubí', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 227, 'name': 'Ernesto Valverde Tejedor', 'nickname': 'Ernesto Valverde', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 221, 'name': 'José Luis Mendilibar Etxebarria', 'nickname': None, 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 187, 'name': 'Abelardo Fernández Antuña', 'nickname': None, 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 227, 'name': 'Ernesto Valverde Tejedor', 'nickname': 'Ernesto Valverde', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 234, 'name': 'Pablo Javier Machín Díez', 'nickname': 'Pablo Machín', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 227, 'name': 'Ernesto Valverde Tejedor', 'nickname': 'Ernesto Valverde', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 227, 'name': 'Ernesto Valverde Tejedor', 'nickname': 'Ernesto Valverde', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 576, 'name': 'Sergio González Soriano', 'nickname': None, 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 227, 'name': 'Ernesto Valverde Tejedor', 'nickname': 'Ernesto Valverde', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 211, 'name': 'Marcelino García Toral', 'nickname': None, 'dob': '1965-08-14', 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 227, 'name': 'Ernesto Valverde Tejedor', 'nickname': 'Ernesto Valverde', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 227, 'name': 'Ernesto Valverde Tejedor', 'nickname': 'Ernesto Valverde', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 227, 'name': 'Ernesto Valverde Tejedor', 'nickname': 'Ernesto Valverde', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 227, 'name': 'Ernesto Valverde Tejedor', 'nickname': 'Ernesto Valverde', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 182, 'name': 'Javier Calleja Revilla', 'nickname': 'Javi Calleja', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 219, 'name': 'Francisco José López Fernández', 'nickname': 'Paco López', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 767, 'name': 'Gaizka Garitano Aguirre', 'nickname': 'Gaizka Garitano', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
[{'id': 228, 'name': 'José Bordalás Jiménez', 'nickname': 'José Bordalás', 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
nan
nan
nan
nan
nan
nan
nan
nan
nan
[{'id': 36, 'name': 'Josep Guardiola i Sala', 'nickname': None, 'dob': None, 'country': {'id': 214, 'name': 'Spain'}}]
nan

如何将其转换为数据框,其中字典中的每个元素都作为列名及其在相应行中的值。这里有某些元素是包含 dicts 作为其项目的列表。当我使用时,这些不会更改为列名

df = pd.json_normalize(mat)

那些带有 dicts 的列表如下图所示:

在此处输入图像描述

在上图中,列home_team.managers有一个 dict 作为其元素。但是我需要它的字典中的每个元素都是一列,对应的值是行。

标签: pythonjsonpandasdataframe

解决方案


尝试使用这个,test.txt有你在上面发布的数据:

dfs = []
with open('test.txt', 'r+') as f:
    for line in f:

        line = line.replace("'", '"')
        line = line.replace("None", '"None"')
        line = line.replace("nan", '[]')
        data = json.loads(line)
        df = pd.json_normalize(data)
        dfs.append(df)

df = pd.concat(dfs).reset_index(drop=['index'])
print(df)

      id                             name           nickname         dob  country.id country.name
0   1816                 Constantin Gâlcă               None  1972-03-08         187      Romania
1    793     Luis Enrique Martínez García       Luis Enrique        None         214        Spain
2    230              Diego Pablo Simeone               None        None          11    Argentina
3    238             Enrique Setién Solar      Quique Setién        None         214        Spain
4    793     Luis Enrique Martínez García       Luis Enrique        None         214        Spain
5    793     Luis Enrique Martínez García       Luis Enrique        None         214        Spain
6    793     Luis Enrique Martínez García       Luis Enrique        None         214        Spain
7    793     Luis Enrique Martínez García       Luis Enrique        None         214        Spain
8    238             Enrique Setién Solar      Quique Setién        None         214        Spain
9     25    Santiago Hernán Solari Poggio               None  1976-10-07          11    Argentina
10   227         Ernesto Valverde Tejedor   Ernesto Valverde        None         214        Spain
11   227         Ernesto Valverde Tejedor   Ernesto Valverde        None         214        Spain
12   229           Eusebio Sacristán Mena  Eusebio Sacristán        None         214        Spain
13   227         Ernesto Valverde Tejedor   Ernesto Valverde        None         214        Spain
14   677     Joan Francesc Ferrer Sicilia               Rubí        None         214        Spain
15   227         Ernesto Valverde Tejedor   Ernesto Valverde        None         214        Spain
16   221  José Luis Mendilibar Etxebarria               None        None         214        Spain
17   187        Abelardo Fernández Antuña               None        None         214        Spain
18   227         Ernesto Valverde Tejedor   Ernesto Valverde        None         214        Spain
19   234         Pablo Javier Machín Díez       Pablo Machín        None         214        Spain
20   227         Ernesto Valverde Tejedor   Ernesto Valverde        None         214        Spain
21   227         Ernesto Valverde Tejedor   Ernesto Valverde        None         214        Spain
22   576          Sergio González Soriano               None        None         214        Spain
23   227         Ernesto Valverde Tejedor   Ernesto Valverde        None         214        Spain
24   211           Marcelino García Toral               None  1965-08-14         214        Spain
25   227         Ernesto Valverde Tejedor   Ernesto Valverde        None         214        Spain
26   227         Ernesto Valverde Tejedor   Ernesto Valverde        None         214        Spain
27   227         Ernesto Valverde Tejedor   Ernesto Valverde        None         214        Spain
28   227         Ernesto Valverde Tejedor   Ernesto Valverde        None         214        Spain
29   182           Javier Calleja Revilla       Javi Calleja        None         214        Spain
30   219   Francisco José López Fernández         Paco López        None         214        Spain
31   767          Gaizka Garitano Aguirre    Gaizka Garitano        None         214        Spain
32   228            José Bordalás Jiménez      José Bordalás        None         214        Spain
33    36           Josep Guardiola i Sala               None        None         214        Spain

推荐阅读