Преобразование списка, содержащего другие списки и словари, в фреймворк 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])