从嵌套字典中的项目构造pandas DataFrame

假设我有一个结构为嵌套的字典“user_dict”:

级别1: UserId(长整型)

级别2:类别(string)

等级3:分类的属性(浮点数,整数等)

例如,这个字典的input是:

user_dict[12] = { "Category 1": {"att_1": 1, "att_2": "whatever"}, "Category 2": {"att_1": 23, "att_2": "another"}} 

“user_dict”中的每个项目具有相同的结构,并且“user_dict”包含大量我想要馈送给pandas DataFrame的项目,从属性构build系列。 在这种情况下,分层索引对于这个目的是有用的。

具体来说,我的问题是,是否存在一种方法来帮助DataFrame构造函数理解该系列应该从字典中的“级别3”的值构build?

如果我尝试像这样:

 df = pandas.DataFrame(users_summary) 

“级别1”(用户ID)的项目被视为列,这是我想要达到的目标(有用户ID作为索引)的相反。

我知道我可以在迭代字典条目之后构build系列,但是如果有更直接的方法,这将非常有用。 类似的问题是询问是否可以从文件中列出的json对象构造一个pandas DataFrame。

一个pandasMultiIndex由一个元组列表组成。 所以最自然的方法是重塑你的input字典,使它的键是你需要的多索引值对应的元组。 然后你可以使用pd.DataFrame.from_dict构造你的数据pd.DataFrame.from_dict ,使用选项orient='index'

 user_dict = {12: {'Category 1': {'att_1': 1, 'att_2': 'whatever'}, 'Category 2': {'att_1': 23, 'att_2': 'another'}}, 15: {'Category 1': {'att_1': 10, 'att_2': 'foo'}, 'Category 2': {'att_1': 30, 'att_2': 'bar'}}} pd.DataFrame.from_dict({(i,j): user_dict[i][j] for i in user_dict.keys() for j in user_dict[i].keys()}, orient='index') att_1 att_2 12 Category 1 1 whatever Category 2 23 another 15 Category 1 10 foo Category 2 30 bar 

另一种方法是通过连接组件数据框来build立你的数据框:

 user_ids = [] frames = [] for user_id, d in user_dict.iteritems(): user_ids.append(user_id) frames.append(pd.DataFrame.from_dict(d, orient='index')) pd.concat(frames, keys=user_ids) att_1 att_2 12 Category 1 1 whatever Category 2 23 another 15 Category 1 10 foo Category 2 30 bar 

所以我曾经使用for循环遍历字典,但有一件事我发现,更快的工作是转换为面板,然后转换为数据框。 假设你有一本字典d

 import pandas as pd d {'RAY Index': {datetime.date(2014, 11, 3): {'PX_LAST': 1199.46, 'PX_OPEN': 1200.14}, datetime.date(2014, 11, 4): {'PX_LAST': 1195.323, 'PX_OPEN': 1197.69}, datetime.date(2014, 11, 5): {'PX_LAST': 1200.936, 'PX_OPEN': 1195.32}, datetime.date(2014, 11, 6): {'PX_LAST': 1206.061, 'PX_OPEN': 1200.62}}, 'SPX Index': {datetime.date(2014, 11, 3): {'PX_LAST': 2017.81, 'PX_OPEN': 2018.21}, datetime.date(2014, 11, 4): {'PX_LAST': 2012.1, 'PX_OPEN': 2015.81}, datetime.date(2014, 11, 5): {'PX_LAST': 2023.57, 'PX_OPEN': 2015.29}, datetime.date(2014, 11, 6): {'PX_LAST': 2031.21, 'PX_OPEN': 2023.33}}} 

命令

 pd.Panel(d) <class 'pandas.core.panel.Panel'> Dimensions: 2 (items) x 2 (major_axis) x 4 (minor_axis) Items axis: RAY Index to SPX Index Major_axis axis: PX_LAST to PX_OPEN Minor_axis axis: 2014-11-03 to 2014-11-06 

其中pd.Panel(d)[item]产生一个dataframe

 pd.Panel(d)['SPX Index'] 2014-11-03 2014-11-04 2014-11-05 2014-11-06 PX_LAST 2017.81 2012.10 2023.57 2031.21 PX_OPEN 2018.21 2015.81 2015.29 2023.33 

然后你可以按命令to_frame()把它变成一个数据框。 我也使用reset_index将主轴和副轴转换为列,而不是将它们作为索引。

 pd.Panel(d).to_frame().reset_index() major minor RAY Index SPX Index PX_LAST 2014-11-03 1199.460 2017.81 PX_LAST 2014-11-04 1195.323 2012.10 PX_LAST 2014-11-05 1200.936 2023.57 PX_LAST 2014-11-06 1206.061 2031.21 PX_OPEN 2014-11-03 1200.140 2018.21 PX_OPEN 2014-11-04 1197.690 2015.81 PX_OPEN 2014-11-05 1195.320 2015.29 PX_OPEN 2014-11-06 1200.620 2023.33 

最后,如果你不喜欢框架的样子,你可以在调用to_frame()之前使用panel的转置function来改变外观,参见http://pandas.pydata.org/pandas-docs/dev/generated /pandas.Panel.transpose.html

只是一个例子

 pd.Panel(d).transpose(2,0,1).to_frame().reset_index() major minor 2014-11-03 2014-11-04 2014-11-05 2014-11-06 RAY Index PX_LAST 1199.46 1195.323 1200.936 1206.061 RAY Index PX_OPEN 1200.14 1197.690 1195.320 1200.620 SPX Index PX_LAST 2017.81 2012.100 2023.570 2031.210 SPX Index PX_OPEN 2018.21 2015.810 2015.290 2023.330 

希望这可以帮助。