Столбец Json в кадре данных Pandas - Разбор и разбиение - PullRequest
1 голос
/ 01 октября 2019

У меня есть фрейм данных json с сообщениями tedx в виде элементов (строк), в котором столбец «рейтинги» в формате json выглядит следующим образом. (В столбце показано, как аудитория описывала доклад)

[{"id": 7, "name": "Funny", "count": 19645}, {"id": 1, "name"":" Beautiful "," count ": 4573}, {" id ": 9," name ":" Ingenious "," count ": 6073}, ..........]

[{"id": 7, "name": "Funny", "count": 544}, {"id": 3, "name": "Courageous", "count": 139}, {"id": 2," name ":" Confused "," count ": 62}, {" id ": 1," name ":" Beautiful "," count ": 58}, ........]

Очевидно, что порядок имен описательных слов не является стандартным / одинаковым для каждого элемента (разговор Тедкс). Каждое слово имеет идентификатор (одинаковый для всех разговоров) и количество соответственно для каждого разговора. Я заинтересован в манипулировании данными и извлечении трех новых целочисленных столбцов, касающихся количества: забавных, вдохновляющих, сбивающих с толку, сохраняя там счетчик для каждого из этих слов для соответствующих переговоров

Среди прочего, пробовал это

   df['ratings'] = df['ratings'].map(lambda x: dict(eval(x)))

в ответ я получаю эту ошибку

Файл "C: / Users / Paul / Google Drive / WEEK4 / ted-talk / w4e1.py", строка 30, в рейтингах df [''] = df [' rating ']. map (лямбда x: dict (eval (x)))

ValueError: элемент последовательности обновления словаря # 0 имеет длину 3;Требуется 2

Пробовал несколько разных способов, но не смог даже получить значения из столбца в формате json должным образом. Есть предложения?

1 Ответ

0 голосов
/ 01 октября 2019

Вы можете использовать понимание списка со сглаживанием и преобразовать строку repr в список dict с помощью ast.literal_eval, что является лучшим решением, например eval :

import pandas as pd
import ast

df = pd.DataFrame({'ratings': ['[{"id": 7, "name": "Funny", "count": 19645}, {"id": 1, "name": "Beautiful", "count": 4573}, {"id": 9, "name": "Ingenious", "count": 6073}]', '[{"id": 7, "name": "Funny", "count": 544}, {"id": 3, "name": "Courageous", "count": 139}, {"id": 2, "name": "Confusing", "count": 62}, {"id": 1, "name": "Beautiful", "count": 58}]']})
print (df)
                                             ratings
0  [{"id": 7, "name": "Funny", "count": 19645}, {...
1  [{"id": 7, "name": "Funny", "count": 544}, {"i...

df1 = pd.DataFrame([y for x in df['ratings'] for y in ast.literal_eval(x)])
print (df1)
   id        name  count
0   7       Funny  19645
1   1   Beautiful   4573
2   9   Ingenious   6073
3   7       Funny    544
4   3  Courageous    139
5   2   Confusing     62
6   1   Beautiful     58
...