【问题标题】:Creating a Pandas Dataframe from List of Dictionaries of Dictionaries从字典列表创建 Pandas 数据框
【发布时间】:2015-11-13 21:20:53
【问题描述】:

我有一个字典列表,其中每个字典代表一条记录。其格式如下:

>>> 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 数据帧的最佳方法是子字典中的这些属性?

例如,我最好将“电话”和“地址”列嵌套在“联系人信息”列下。

我可以按如下方式读取数据,但希望将联系信息列分成子列。

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

【问题讨论】:

  • 您希望电话和地址分列吗?

标签: python dictionary pandas


【解决方案1】:

这个怎么样

声明空数据框

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

【讨论】:

    【解决方案2】:

    这是一个非常笨拙的解决方法,我能够得到我需要的东西。我遍历列,找到由 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
    >>> 
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-05-12
        • 2017-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多