将包含其他列表和字典的列表转换为熊猫数据框

时间:2019-11-04 11:12:45

标签: python pandas naked-objects

我想将一个列表(似乎是字典列表(其中包含其他列表))转换为熊猫数据框。

以下是我的数据示例:

['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个

注意:当我提取数据时,我将其转换为列表,以阐明我正在使用naked package运行一个node.js文件,该文件返回json输出,然后我将其保存到成功变量中,最初是字节字符串格式,然后转换为列表:

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

2 个答案:

答案 0 :(得分:0)

您正在读取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])

答案 1 :(得分:0)

拆分数据字符串无济于事-使其解析起来更加困难。

  

错误消息:JSONDecodeError:期望属性名称用双引号引起来:第2行第3列(字符4)

这显然表明一个问题是未加引号的键;进一步的问题是未引用的值trueArrayObject。但是纠正所有这些并不难:

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'])