簡體   English   中英

從字典詞典列表創建Pandas數據框

[英]Creating a Pandas Dataframe from List of Dictionaries of Dictionaries

我有一個字典列表,其中每個字典代表一條記錄。 格式如下:

>>> 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數據框中的最佳方法是什么?

例如,理想情況下,我會在“ contactinfo”列下面嵌套“ Phone”和“ Address”列。

我可以按以下方式讀取數據,但希望將聯系信息列細分為子列。

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

這個怎么樣

聲明空數據框

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

這是一個很笨拙的解決方法,我能夠得到所需的東西。 我遍歷各列,找到由字典組成的列,然后將其分為多個列,然后將其合並到數據框。 我很高興聽到任何改進此代碼的方法。 我以為理想情況下,數據框架將從一開始就構建而無需將字典作為值。

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

不知道最好還是不知道,但是您可以分兩個步驟進行操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM