Борьба за нормализацию вложенных данных JSON - PullRequest
0 голосов
/ 04 октября 2018

У меня есть несколько точек данных JSON, которые выглядят примерно так:

[{'id': 36001, 'default': False, 'name': 'Production', 'raw_name': 'Production', 'value': 'production'}, {'id': 3600, 'default': False, 'name': 'Development', 'raw_name': 'Development', 'value': 'development'}, {'id': 36001, 'default': False, 'name': 'Staging', 'raw_name': 'Staging', 'value': 'staging'}]
[{'id': 36001, 'default': False, 'name': 'Add/Remove User', 'raw_name': 'Add/Remove User', 'value': 'req____add/remove_user'}, {'id': 36004, 'default': False, 'name': 'Add/Remove Subscription', 'raw_name': 'Add/Remove Subscription', 'value': 'req____add/remove_subscription'}, {'id': 36001, 'default': False, 'name': 'Other', 'raw_name': 'Other', 'value': 'other'}]
[{'id': 36002, 'default': False, 'name': '2', 'raw_name': '2', 'value': '2'}, {'id': 362, 'default': False, 'name': 'A', 'raw_name': 'A', 'value': 'a'}, {'id': 36001, 'default': False, 'name': 'B', 'raw_name': 'B', 'value': 'b'}, {'id': 36001, 'default': False, 'name': 'C', 'raw_name': 'C', 'value': 'c'}]

Я хочу нормализовать данные, и я попробовал это:

df1 = pd.DataFrame.from_dict(json_normalize(df1), orient='columns')

Это далоследующая ошибка:

 'str' object has no attribute 'values'

Судя по моим исследованиям, это должно сработать.Я думаю, что мешает ему работать, так это то, что у меня есть куча строк только с этим: [] [] [] [] (каждая из этих 4 находится в разных строках фрейма данных).Как я могу исключить [] в каждой строке и нормализовать весь JSON в фрейме данных?

Например, если я сделаю это:

df1 = [{'id': 36001, 'default': False, 'name': 'Production', 'raw_name': 'Production', 'value': 'production'}, {'id': 3600, 'default': False, 'name': 'Development', 'raw_name': 'Development', 'value': 'development'}, {'id': 36001, 'default': False, 'name': 'Staging', 'raw_name': 'Staging', 'value': 'staging'}]
df2 = pd.DataFrame.from_dict(json_normalize(df1), orient='columns')
print(df2)

Я получу это:

   default     id         name     raw_name        value
0    False  36001   Production   Production   production
1    False   3600  Development  Development  development
2    False  36001      Staging      Staging      staging

Это то, что я хочу закончить, но я получаю странные ошибки, и я думаю, что это из-за [] [] [] и т. Д., У меня есть десятки из них, все в отдельных строках, в моем фрейме данных.

Вот небольшой скриншот того, на что я смотрю в CSV-файле, который выкладывает мой код (я не знаю, как представить его в JSON; я просто вижу, как он выглядит вфайл CSV).

enter image description here

1 Ответ

0 голосов
/ 04 октября 2018

Метод json_normalize,

pandas.io.json.json_normalize(data, record_path=None, meta=None, meta_prefix=None, record_prefix=None, errors='raise', sep='.')

ожидает параметр data следующим образом:

data : dict or list of dicts; Unserialized JSON objects

pandas.io.json.json_normalize

df1 = pd.DataFrame.from_dict(pd.io.json.json_normalize(df1), orient='columns')

Исходя из примера кода, DataFrame, по-видимому, передается в json_normalize, когда предполагается, что это диктат или список диктов.Если вы передадите необработанный json, ошибка не будет выдана, как вы заявили выше.

Краткое руководство: Сглаживание вложенного JSON в Pandas

Если я беру предоставленные данные:

d1 = [{'id': 36001, 'default': False, 'name': 'Production', 'raw_name': 'Production', 'value': 'production'}, 
      {'id': 3600, 'default': False, 'name': 'Development', 'raw_name': 'Development', 'value': 'development'}, 
      {'id': 36001, 'default': False, 'name': 'Staging', 'raw_name': 'Staging', 'value': 'staging'}]
d2 = [{'id': 36001, 'default': False, 'name': 'Add/Remove User', 'raw_name': 'Add/Remove User', 'value': 'req____add/remove_user'}, 
      {'id': 36004, 'default': False, 'name': 'Add/Remove Subscription', 'raw_name': 'Add/Remove Subscription', 'value': 'req____add/remove_subscription'}, 
      {'id': 36001, 'default': False, 'name': 'Other', 'raw_name': 'Other', 'value': 'other'}]
d3 = [{'id': 36002, 'default': False, 'name': '2', 'raw_name': '2', 'value': '2'}, 
      {'id': 362, 'default': False, 'name': 'A', 'raw_name': 'A', 'value': 'a'}, 
      {'id': 36001, 'default': False, 'name': 'B', 'raw_name': 'B', 'value': 'b'}, 
      {'id': 36001, 'default': False, 'name': 'C', 'raw_name': 'C', 'value': 'c'}]

df1 = pd.DataFrame.from_dict(pd.io.json.json_normalize(d1), orient='columns')
df2 = pd.DataFrame.from_dict(pd.io.json.json_normalize(d2), orient='columns')
df3 = pd.DataFrame.from_dict(pd.io.json.json_normalize(d3), orient='columns')

Проверка пустого фрейма данных

df4 = pd.DataFrame.from_dict([])
df4.empty
True

Объединение их - пример вручную

df = pd.concat([df1, df2, df3])

Объедините их - цикл

list_of_dfs = [df1, df2, df3, df4]

df = pd.DataFrame()
for x in list_of_dfs:
    if not x.empty:
        df = df.append(x)

df.to_csv('test.csv')

В этом примере выходной сигнал from_dict и json_normalize

pd.DataFrame.from_dict(d2) == pd.io.json.json_normalize(d2) равенTrue

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...