Как выровнять список диктантов в панд?

#python #json #pandas #dataframe

#питон #json #панды #фрейм данных

Вопрос:

У меня есть такой объект, как

 l = [ {'id': 1, 'name': 'a', 'obj2': [{'a': 3, 'b': 6}, {'a':4, 'b': 5}], 'obj': [{'x': 6, 'y': 'p'}, {'x': 10, 'y': 'q', 'z': 'qqq'}]}, {'id': 2, 'name': 'b', 'obj': [{'x': 10, 'y': 'r'}], 'obj2': [{'a': 9, 'i': 's'}]} ]  

и я хочу сделать его фреймом данных, как:

 id name a i b x y z 1 a 3 6 6 p  1 a 3 6 10 q qqq 1 a 4 5 6 p  1 a 4 5 10 q qqq  2 b 9 s 10 r  

Внутри буквы l все клавиши будут одинаковыми. Но у меня может быть другой l с другим именем ключа и разным количеством объектов со списками внутри l[0]. Мы очень ценим любую помощь.

Ответ №1:

Это идеальный вариант использования для pd.json_normalize :

 l = [{'id': 1, 'name': 'a', 'obj': [{'x': 6, 'y': 'p'}, {'x': 10, 'y': 'q', 'z': 'qqq'}]},  {'id': 2, 'name': 'b', 'obj': [{'x': 10, 'y': 'r'}]}]  df = pd.json_normalize(l, 'obj', ['id', 'name']) print(df)  # Output:  x y z id name 0 6 p NaN 1 a 1 10 q qqq 1 a 2 10 r NaN 2 b  

Udpate:

Я хочу использовать один и тот же код для каждого объекта с таким типом структуры, но,возможно,идентификатор, имя, объект будут называться по-разному

 keys = list(l[0].keys()) df = pd.json_normalize(l, keys[-1], keys[:-1]) print(df)  # Output:  x y z id name 0 6 p NaN 1 a 1 10 q qqq 1 a 2 10 r NaN 2 b  

Комментарии:

1. что делать, если ключи не всегда будут одинаковыми, я хочу использовать один и тот же код для каждого объекта,имеющего такой тип структуры,но, возможно, идентификатор, имя, объект будут называться по-разному

2. Вы можете обновить образец с таким случаем, пожалуйста?

3. Ничего сумасшедшего, но мне нужен один и тот же код для работы, даже если я изменю имя ключей. Ваше решение работает только для некоторых определенных ключей. [ {idq: 1, имя: «a», objq: [{xq:6, yq:»p»}, {xq:10, yq:»q»,zq:»qqq»}]}, {idq: 2, имя: «b», objq: [{xq:10, yq:»r»}]} ]

4. Для одного и того же списка все ключи одинаковы, не так ли?

5. @AndreiToader. Я обновил свой ответ. Не могли бы вы проверить это, пожалуйста?