Как исправить json_normalize, когда он не может перебрать столбец для выравнивания?

2

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

ID       phone_numbers
1        [{u'updated_at': u'2017-12-02 15:29:54', u'created_at': u'2017-12-0 
          2 15:29:54', u'sms': 0, u'number': u'1112223333', u'consumer_id': 
          12345, u'organization_id': 1, u'active': 1, u'deleted_at': 
           None, u'type': u'default', u'id': 1234}]

Я хочу взять столбец phone_numbers и сгладить информацию внутри него, чтобы я мог запросить, скажем, поле 'id'.

Когда я пытаюсь;

json_normalize(df.phone_numbers)

Я получаю ошибку:

AttributeError: у объекта 'str' нет атрибута 'itervalues'

Я не уверен, почему эта ошибка возникает и почему я не могу сгладить этот столбец.

РЕДАКТИРОВАТЬ:

Первоначально строка JSON читается из объекта ответа (r.text):

https://docs.google.com/document/d/1Iq4PMcGXWx6O48sWqqYnZjG6UMSZoXfmN1WadQLkWYM/edit?usp=sharing

РЕДАКТИРОВАТЬ:

С помощью этой команды преобразовал столбец, который мне нужно выровнять в JSON

a = df.phone_numbers.to_json()

{"0":[{"updated_at":"2018-04-12 12:24:04","created_at":"2018-04-12 12:24:04","sms":0,"number":"","consumer_id":123,"org_id":123,"active":1,"deleted_at":null,"type":"default","id":123}]}
  • 0
    Одна идея, DataFrame создан из json ? Может быть, лучше использовать df = json_normalize(json)
  • 0
    Я попробовал это, так как я получаю ответ json через API. но я получаю ту же ошибку, что и выше
Показать ещё 3 комментария
Теги:
pandas

2 ответа

3
Лучший ответ

Используйте понимание списка с выравниванием и добавлением нового ID элемента в словарь:

df = pd.DataFrame({'ID': [1, 2], 'phone_numbers': [[{'a': '2017', 'b': '2017', 'sms': 1}, 
                                                    {'a': '2018', 'b': '2017', 'sms': 2}], 
                                                  [{'a': '2017', 'b': '2017', 'sms': 3}]]})
print (df)
   ID                                      phone_numbers
0   1  [{'a': '2017', 'b': '2017', 'sms': 1}, {'a': '...
1   2             [{'a': '2017', 'b': '2017', 'sms': 3}]

df = pd.DataFrame([dict(y, ID=i) for i, x in df.values.tolist() for y in x])
print (df)  

   ID     a     b  sms
0   1  2017  2017    1
1   1  2018  2017    2
2   2  2017  2017    3

РЕДАКТИРОВАТЬ:

df = pd.DataFrame({'phone_numbers':{"0":[{"type":"default","id":123}]}})

df = pd.DataFrame([y for x in df['phone_numbers'].values.tolist() for y in x])
print (df) 
    id     type
0  123  default
  • 0
    извините за задержку с ответом. Когда я запустил указанную выше строку, я получил ошибку «слишком много значений для распаковки». Я думаю, что проблема, возможно, в том, что поле идентификатора встроено во вложенный json, а не как отдельный столбец. Как вы думаете, поэтому ваш код не работает для меня?
  • 0
    После ввода столбца идентификатора я все еще получаю сообщение об ошибке «слишком много значений для распаковки»
Показать ещё 15 комментариев
2

Я не уверен, но я думаю, что json normalize ожидает в качестве первого аргумента json, а не pd.series, pd.series преобразует серию в dict или список dict. Вы можете использовать to_dict()

json_normalize(df.phone_numbers.to_dict())
  • 1
    Когда я попробовал это, он преобразовал весь столбец в один ряд.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню