2015-11-13 141 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