从词典列表中创建Pandas Dataframe

时间:2015-11-13 21:20:54

标签: python dictionary pandas

我有一个词典列表,每个词典代表一个记录。格式如下:

>>> ListOfData=[
... {'Name':'Andrew',
...  'number':4,
...  'contactinfo':{'Phone':'555-5555', 'Address':'123 Main St'}},
... {'Name':'Ben',
...  'number':6,
...  'contactinfo':{'Phone':'555-5554', 'Address':'124 2nd St'}},
... {'Name':'Cathy',
...  'number':1,
...  'contactinfo':{'Phone':'555-5556', 'Address':'126 3rd St'}}]
>>> 
>>> import pprint
>>> pprint.pprint(ListOfData)
[{'Name': 'Andrew',
  'contactinfo': {'Address': '123 Main St', 'Phone': '555-5555'},
  'number': 4},
 {'Name': 'Ben',
  'contactinfo': {'Address': '124 2nd St', 'Phone': '555-5554'},
  'number': 6},
 {'Name': 'Cathy',
  'contactinfo': {'Address': '126 3rd St', 'Phone': '555-5556'},
  'number': 1}]
>>> 

在子词典中为这些属性读取带有多索引列的Pandas数据帧的最佳方法是什么?

例如,我理想情况下将'Phone'和'Address'列嵌套在'contactinfo'列下。

我可以在数据中读取如下内容,但希望将联系信息列分成子列。

>>> pd.DataFrame.from_dict(ListOfData)
     Name                                        contactinfo  number
0  Andrew  {u'Phone': u'555-5555', u'Address': u'123 Main...       4
1     Ben  {u'Phone': u'555-5554', u'Address': u'124 2nd ...       6
2   Cathy  {u'Phone': u'555-5556', u'Address': u'126 3rd ...       1
>>> 

3 个答案:

答案 0 :(得分:0)

这个怎么样

声明空数据框

df = DataFrame(columns=('Name', 'conntactinfo', 'number'))

然后遍历List并添加行

for row in ListOfData:
    df.loc[len(df)] = row

完整代码

import pandas as pd

ListOfData=[
 {'Name':'Andrew',
  'number':4,
  'contactinfo':{'Phone':'555-5555', 'Address':'123 Main St'}},
 {'Name':'Ben',
  'number':6,
  'contactinfo':{'Phone':'555-5554', 'Address':'124 2nd St'}}]

df = pd.DataFrame(columns=('Name', 'contactinfo', 'number'))

for row in ListOfData:

    df.loc[len(df)] = row

print(df)

打印

  Name                                      contactinfo  number
0  Andrew  {'Phone': '555-5555', 'Address': '123 Main St'}       4
1     Ben   {'Phone': '555-5554', 'Address': '124 2nd St'}       6

答案 1 :(得分:0)

这是一个非常笨重的解决方法,我能够得到我需要的东西。我循环遍历列,找到由dicts组成的列,然后将其分成多列并将其合并到数据帧。我很感激听到任何改进此代码的方法。我想,理想情况下,数据框将从一开始就构建,而不会将字典作为值。

>>> df=pd.DataFrame.from_dict(ListOfData)
>>> 
>>> for name,col in df.iteritems():
...     if any(isinstance(x, dict) for x in col.tolist()):
...         DividedDict=col.apply(pd.Series)
...         DividedDict.columns=pd.MultiIndex.from_tuples([(name,x) for x in DividedDict.columns.tolist()])
...         df=df.join(DividedDict)
...         df.drop(name,1, inplace=True)
... 
>>> print df
     Name  number (contactinfo, Address) (contactinfo, Phone)
0  Andrew       4            123 Main St             555-5555
1     Ben       6             124 2nd St             555-5554
2   Cathy       1             126 3rd St             555-5556
>>> 

答案 2 :(得分:0)

不知道最好与否,但你可以分两步完成:

>>> df = pd.DataFrame(ListOfData)
>>> df = df.join(pd.DataFrame.from_records(df.pop("contactinfo")))
>>> df
     Name  number      Address     Phone
0  Andrew       4  123 Main St  555-5555
1     Ben       6   124 2nd St  555-5554
2   Cathy       1   126 3rd St  555-5556