Преобразование списка, содержащего другие списки и словари, в фреймворк pandas

Я хотел бы преобразовать список, который выглядит как список словарей (и с другими списками внутри него) в фреймворк pandas.

Вот образец моих данных:

['b"{',
 'n  boxers: [',
 'n    {',
 'n      age: 30,',
 'n      hasBoutScheduled: true,',
 'n      id: 489762,',
 'n      last6: [Array],',
 "n      name: 'Andy Ruiz Jr',",
 'n      points: 754,',
 'n      rating: 100,',
 'n      record: [Object],',
 'n      residence: [Object],',
 "n      stance: 'orthodox'",
 'n    },',
 'n    {',
 'n      age: 34,',
 'n      hasBoutScheduled: true,',
 'n      id: 468841,',
 'n      last6: [Array],',
 "n      name: 'Deontay Wilder',",
 'n      points: 622,',
 'n      rating: 100,',
 'n      record: [Object],',
 'n      residence: [Object],',
 "n      stance: 'orthodox'",
 'n    },',
 'n    {',
 'n      age: 30,',
 'n      hasBoutScheduled: true,',
 'n      id: 659461,',
 'n      last6: [Array],',
 "n      name: 'Anthony Joshua',",
 'n      points: 603,',
 'n      rating: 100,',
 'n      record: [Object],',
 'n      residence: [Object],',
 "n      stance: 'orthodox'",
 'n    },'

Вот что я пробовал до сих пор:

pd.DataFrame.from_records(unclean_file)

Это дает около 27 столбцов - предположительно столбец для каждого пробела, запятой и т. Д.

Я также пробовал использовать ChainMap из импорта коллекций ChainMap

pd.DataFrame.from_dict(ChainMap(*unclean_file),orient='index',columns=['age','hasBoutScheduled','id','last6','name','points','rating','record','residence','stance'])

Это вызывает сообщение об ошибке: ValueError: элемент № 0 последовательности обновления словаря имеет длину 1; 2 требуется

Примечание. Когда я извлек данные, я преобразовал их в список - чтобы уточнить, я использую голый пакет для запуска файла node.js, который возвращает вывод json, который я затем сохраняю в переменной success, сначала в формате строки байтов, а затем преобразовываю в список:

success = muterun_js('index.js')
unclean_file = [str(success.stdout).split('\\')]

2 ответа

Разделение строки данных не помогает - это еще больше усложняет синтаксический анализ.

сообщение об ошибке: JSONDecodeError: Ожидается имя свойства, заключенное в двойные кавычки: строка 2, столбец 3 (символ 4)

Это ясно говорит о том, что одна проблема - это ключи без кавычек; дальнейшие проблемы - это значения без кавычекtrue, Array а также Object. Но все это исправить не так уж и сложно:

unclean_string = success.stdout.decode()
import re
clean_string = re.sub(r'\w+(?=[],:])', r'"\g<0>"', unclean_string)

Выше цитируются все идентификаторы, за которыми следует :, , или ], и мы получаем хорошо сформированный dict представление, которое мы можем оценить и составить DataFrame из:

pd.DataFrame(eval(clean_string)['boxers'])

Вы читаете данные в формате json, поэтому было бы разумнее использовать unclean_file = json.loads(success) вместо того unclean_file = [str(success.stdout).split('\\')].

Это должно вернуть вам объект dict, который вы можете напрямую вставить в DataFrame.

Кроме того, вам может потребоваться декодировать ваши данные.

import json
import pandas as pd

success= success.decode('utf-8') # decode your content. Might not be necessary. 
unclean_file = json.loads(success)
data = pd.DataFrame(unclean_file , index=[0])
Другие вопросы по тегам