Получение ошибки для нормализации вложенного списка в Python - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть вложенный список со словарем.Ниже приведен только первый элемент списка

    {'id': 'abcde',
     'authorization': None,
     'operation_type': 'xx',
     'method': 'card',
     'transaction_type': 'asd',
     'card': {'type': 'dd',
      'brand': 'vv',
      'address': {'line1': 'xxxxxxx',
       'line2': '',
       'line3': '',
       'state': 'xx',
       'city': 'xxx',
       'postal_code': '12345',
       'country_code': 'xx'},
      'card_number': '123456XXXXXX7890',
      'holder_name': 'name user,
      'expiration_year': '20',
      'expiration_month': '02',
      'allows_charges': True,
      'allows_payouts': True,
      'bank_name': 'abc bank',
      'bank_code': '000'},
     'status': 'fgh',
     'conciliated': True,
     'creation_date': '2018-09-23T23:58:17-05:00',
     'operation_date': '2018-09-23T23:58:17-05:00',
     'description': 'asdmdefdsa',
     'error_message': 'sdaskjflj',
     'order_id': 'ashdgjasdfhk',
     'amount': 418.0,
     'customer': {'name': 'abc',
      'last_name': 'xyz',
      'email': 'abcdef@hotmail.com',
      'phone_number': '12345678',
      'address': None,
      'creation_date': '2018-09-23T23:58:18-05:00',
      'external_id': None,
      'clabe': None},
     'fee': {'amount': 0.56, 'tax': 0.91, 'currency': 'XXX'},
     'currency': 'XXX'},
{'id': 'abcde',
     'authorization': None,
     'operation_type': 'xx',
     'method': 'card',
     'transaction_type': 'asd',
     'card': {'type': 'dd',
      'brand': 'vv',
      'address': {'line1': 'xxxxxxx',
       'line2': '',
       'line3': '',
       'state': 'xx',
       'city': 'xxx',
       'postal_code': '12345',
       'country_code': 'xx'},
      'card_number': '123456XXXXXX7890',
      'holder_name': 'name user,
      'expiration_year': '20',
      'expiration_month': '02',
      'allows_charges': True,
      'allows_payouts': True,
      'bank_name': 'abc bank',
      'bank_code': '000'},
     'status': 'fgh',
     'conciliated': True,
     'creation_date': '2018-09-23T23:58:17-05:00',
     'operation_date': '2018-09-23T23:58:17-05:00',
     'description': 'asdmdefdsa',
     'error_message': 'sdaskjflj',
     'order_id': 'ashdgjasdfhk',
     'amount': 418.0,
     'customer': {'name': 'abc',
      'last_name': 'xyz',
      'email': 'abcdef@hotmail.com',
      'phone_number': '12345678',
      'address': None,
      'creation_date': '2018-09-23T23:58:18-05:00',
      'external_id': None,
      'clabe': None},
     'fee': {'amount': 0.56, 'tax': 0.91, 'currency': 'XXX'},
     'currency': 'XXX'}

Я хочу нормализовать данные в dataframe.Я написал код как: json_normalize (d).Но я получаю следующую ошибку:

--------------------------------------------------------------------------- KeyError Traceback (последний вызов последним) в() ----> 1 df = json_normalize (data)

/ anaconda3 / lib / python3.6 / site-packages / pandas / io / json / normalize.py в json_normalize (данные, запись_путь, мета, meta_prefix, record_prefix, errors, sep) 201 # TODO: обрабатывать значения записей, которые являются списками, по крайней мере, ошибка 202 # разумно -> 203 data = nested_to_record (data, sep = sep) 204 возвращать DataFrame (data) 205 elif not isinstance(запись_путь, список):

/ anaconda3 / lib / python3.6 / site-packages / pandas / io / json / normalize.py в nested_to_record (ds, prefix, sep, level) 86 остальное: 87 v= new_d.pop (k) ---> 88 new_d.update (nested_to_record (v, newkey, sep, level + 1)) 89 new_ds.append (new_d) 90

/ anaconda3 / lib / python3.6 / site-packages / pandas / io / json / normalize.py в nested_to_record (ds, prefix, sep, level) 82 new_d [newkey] = v 83, если v - None: # вывести ключ, если thе значение None ---> 84 new_d.pop (k) 85 продолжить 86 else:

KeyError: 'address'

Я понял это, потому что адрес в None, коддает мне ошибку.Но я не знаю, как это исправить.Любая помощь в этом отношении будет высоко оценена.Заранее спасибо.(Обратите внимание, что данные являются фиктивными данными)

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Я пытался воспроизвести эту ошибку, но не смог.После создания python3 venv и установки панд с pip я скопировал ваш код (словарь python, а не json - моя ошибка, спасибо @AlessandroCosentino +1 от меня) в редактор и обнаружил, что строки 16 и 56 пропускают одну кавычку 'holder_name': 'name user, и должно быть 'holder_name': 'name user',

from pandas.io.json import json_normalize
data = {'id': 'abcde',
        'authorization': None,
        'operation_type': 'xx',
        'method': 'card',
        'transaction_type': 'asd',
        'card': {'type': 'dd',
        'brand': 'vv',
        'address': {'line1': 'xxxxxxx',
        'line2': '',
        'line3': '',
        'state': 'xx',
        'city': 'xxx',
        'postal_code': '12345',
        'country_code': 'xx'},
        'card_number': '123456XXXXXX7890',
        'holder_name': 'name user',
        'expiration_year': '20',
        'expiration_month': '02',
        'allows_charges': True,
        'allows_payouts': True,
        'bank_name': 'abc bank',
        'bank_code': '000'},
        'status': 'fgh',
        'conciliated': True,
        'creation_date': '2018-09-23T23:58:17-05:00',
        'operation_date': '2018-09-23T23:58:17-05:00',
        'description': 'asdmdefdsa',
 'error_message': 'sdaskjflj',
 'order_id': 'ashdgjasdfhk',
 'amount': 418.0,
 'customer': {'name': 'abc',
  'last_name': 'xyz',
  'email': 'abcdef@hotmail.com',
  'phone_number': '12345678',
  'address': None,
  'creation_date': '2018-09-23T23:58:18-05:00',
  'external_id': None,
  'clabe': None},
 'fee': {'amount': 0.56, 'tax': 0.91, 'currency': 'XXX'},
 'currency': 'XXX'},
  {'id': 'abcde',
 'authorization': None,
 'operation_type': 'xx',
 'method': 'card',
 'transaction_type': 'asd',
 'card': {'type': 'dd',
  'brand': 'vv',
  'address': {'line1': 'xxxxxxx',
   'line2': '',
   'line3': '',
   'state': 'xx',
   'city': 'xxx',
   'postal_code': '12345',
   'country_code': 'xx'},
  'card_number': '123456XXXXXX7890',
  'holder_name': 'name user',
  'expiration_year': '20',
  'expiration_month': '02',
  'allows_charges': True,
  'allows_payouts': True,
  'bank_name': 'abc bank',
  'bank_code': '000'},
 'status': 'fgh',
 'conciliated': True,
 'creation_date': '2018-09-23T23:58:17-05:00',
 'operation_date': '2018-09-23T23:58:17-05:00',
 'description': 'asdmdefdsa',
 'error_message': 'sdaskjflj',
 'order_id': 'ashdgjasdfhk',
 'amount': 418.0,
 'customer': {'name': 'abc',
  'last_name': 'xyz',
  'email': 'abcdef@hotmail.com',
  'phone_number': '12345678',
  'address': None,
  'creation_date': '2018-09-23T23:58:18-05:00',
  'external_id': None,
  'clabe': None},
 'fee': {'amount': 0.56, 'tax': 0.91, 'currency': 'XXX'},
 'currency': 'XXX'}


print(json_normalize(data))

на выходе это a screenshot from my term

Этого можно легко избежать с помощью интеллектуального редактора - например, SublimeText - сподсветка питона.Какой редактор вы используете?

0 голосов
/ 27 сентября 2018

Словарь плохо отформатирован.Прежде всего, у вас есть строки вроде следующего:

'holder_name': 'name user,

, где значение 'name user не является допустимой строкой, так как оно не заключено в одиночный символ кавычки справа.

Во-вторых, в вашем коде у вас есть два элемента списка, то есть два словаря, каждый из которых начинается с {'id': ..., в отличие от одного элемента, как заявлено.

После исправления значений 'holder_name в обоих словарях и сделав его списком из двух членов, вы можете продолжить с помощью json_normalize, и вы получите вывод, подобный следующему (с выводом в stdout):

   amount authorization card.address.city card.address.country_code    ...        operation_type      order_id status transaction_type 0  
418.0          None               xxx                        xx       ...                    xx  ashdgjasdfhk    fgh              asd 1  
418.0          None               xxx                        xx       ...                    xx  ashdgjasdfhk    fgh              asd

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