python - 如何使用 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 作为其元素。但是我需要它的字典中的每个元素都是一列,对应的值是行。
解决方案
尝试使用这个,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
推荐阅读
- delphi - 使用 TIdIOHandlerStream 和 TIdTCPClient 读取数据流
- python - 在函数内启动线程
- c++ - 检查两个字符串是否是字谜
- javascript - 用javascript显示奇数
- database - 如何将两列返回到函数中?
- html - 如何缩短没有标题和描述的svg文件的代码
- python - python中的API密钥
- apiconnect-test-monitor - 如何在 APIC 测试和监控中发送警报?
- c# - 在 Listview 中显示 ObservableCollection
- python - 通过 QValidator 验证可编辑的 QCombobox 输入是否是目录