2015-11-13 117 views
1

我有一个词典列表,其中每个词典表示一个记录。它的格式如下:从词典字典列表创建熊猫数据框

>>> 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}] 
>>> 

什么是读入数据帧的熊猫与在子字典的属性多指标列的最佳方式?

例如,我最好将'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 
>>> 
+0

你要的电话和地址是单独列? – AbtPst

回答

0

这个怎么样

声明空数据帧

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

然后遍历目录,并添加行

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 
0

这里是一个非常笨拙的解决办法,我能得到我所需要的。我循环遍历列,找到那些由字典组成的列,然后将它分成多列并将其合并到数据框。我希望听到任何改进这个代码的方法。我会想象,理想情况下,数据框将从一开始就构建而不需要字典作为值。

>>> 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 
>>> 
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