Для цикла Вернуть все

У меня есть кадр данных Pandas со строками json в строке. Я хотел бы запустить цикл for для json_normalize каждой строки и вернуть данные в другой фрейм данных, чтобы я мог получить доступ к определенным парам ключ_значение.

Моя функция выглядит так:

for line in df:
        json_normalize(line)

Это печатает данные, которые мне нужны, но я хотел бы получить их в объект, чтобы я мог читать их как фрейм данных и выполнять над ним операции. Данные такие:

3     [{u'from': {u'name': u'Aaron Roth', u'id': u'1...
5     [{u'from': {u'name': u'Elle Oh', u'id': u'1020...
6     [{u'from': {u'name': u'Chris Magorian', u'id':...
7     [{u'from': {u'name': u'Jimmy George', u'id': u...
8     [{u'from': {u'name': u'A'raelle Flynn-Bolden',...
12    [{u'from': {u'name': u'Aaron Roth', u'id': u'1...
13    [{u'from': {u'name': u'A'raelle Flynn-Bolden',...
16    [{u'from': {u'name': u'Matthew Emery', u'id': ...
17    [{u'from': {u'name': u'Elle Oh', u'id': u'1020...
18    [{u'from': {u'name': u'Gyasi Silas', u'id': u'...
19    [{u'from': {u'name': u'Alice Magorian', u'id':...
23    [{u'from': {u'name': u'Jonathan Jayasinghe', u...
24    [{u'from': {u'name': u'Aaron Roth', u'id': u'1...

person cmagorian    schedule 04.08.2015    source источник
comment
Я думаю, вам нужен еще один шаг, чтобы сгладить структуру JSON, чтобы не было вложенных/встроенных документов. После этого вы можете просто использовать pandas.read_json(orient=records) для чтения данных в фрейм данных.   -  person Jianxun Li    schedule 04.08.2015
comment
Как мне снова сгладить json? Мой цикл for пытается его сгладить? Что бы вы сделали, чтобы сгладить его? Я использую json_normalize в объекте, прежде чем читать его во фрейм данных/   -  person cmagorian    schedule 04.08.2015


Ответы (1)


Вы можете использовать метод map в столбце json-text, чтобы применить функцию lambda, которая будет анализировать json с помощью json.loads, а затем возвращать нужное поле.

import json

name = df.json_text.map(lambda s: json.loads(s)['from']['name'])
id = df.json_text.map(lambda s: json.loads(s)['from']['id'])

flattened = pd.DataFrame({'name':name, 'id',id})

В качестве альтернативы, если вы хотите сразу ввести все поля «от» (и если в этом поле нет дальнейшего вложения), вы можете просто вызвать

flattened = pd.DataFrame(name = df.json_text.map(lambda s: json.loads(s)['from']['name'])
person maxymoo    schedule 04.08.2015
comment
который возвращает ошибку: TypeError: ожидаемая строка или буфер. Что я должен сделать, чтобы передать серию в Str, которую может прочитать json.loads? Или мне просто передать функцию json_normalize? - person cmagorian; 06.08.2015