为了账号安全,请及时绑定邮箱和手机立即绑定

从嵌套字典中的项目构建熊猫数据框架

/ 猿问

从嵌套字典中的项目构建熊猫数据框架

123456qqq 2019-10-12 07:07:18

从嵌套字典中的项目构建熊猫数据框架

假设我有一个具有结构的嵌套字典‘user_dict’:

第1级:用户ID(长整数)

2级:类别(字符串)

第3级:分类属性(浮点数、INT等)

例如,本词典的条目如下:

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

“user_dict”中的每个项都具有相同的结构,“user_dict”包含大量的项目,我希望将这些项提供给熊猫DataFrame,从属性构建系列。在这种情况下,分层索引对此非常有用。

具体来说,我的问题是,是否有一种方法可以帮助DataFrame构造器理解这个系列应该从字典中的“第3级”的值构建?

如果我尝试这样的方法:

df = pandas.DataFrame(users_summary)

“第1级”(用户id)中的项被视为列,这与我想要实现的(以用户id作为索引)相反。

我知道我可以在遍历字典条目之后构建这个系列,但是如果有一种更直接的方法,这将是非常有用的。一个类似的问题是,是否有可能从文件中列出的JSON对象构建熊猫DataFrame。


查看完整描述

3 回答

?
忽然笑

熊猫多重指数由一组元组成。因此,最自然的方法是重塑您的输入DECT,以便它的键是与您所需的多索引值相对应的元组。然后,您就可以使用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

另一种方法是通过连接组件dataframes来构建数据框架:


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



查看完整回答
反对 回复 2019-10-13
?
POPMUISE

因此,我过去也使用for循环来迭代字典,但是我发现一件工作更快的事情是转换到面板,然后转换到Dataaframe。假设你有一本字典


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]生成数据


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_framework()将其转换为dataframe。我还使用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

最后,如果您不喜欢框架的外观,可以使用面板的Transspose函数在调用_Frame()之前更改外观-参见这里的文档http:/andas.pydata.org/大熊猫-docs/dev/generated/panas.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

希望这能帮上忙。



查看完整回答
反对 回复 2019-10-13
?
慕用2447696

因此,我过去也使用for循环来迭代字典,但是我发现一件工作更快的事情是转换到面板,然后转换到Dataaframe。假设你有一本字典


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]生成数据


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_framework()将其转换为dataframe。我还使用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

最后,如果您不喜欢框架的外观,可以使用面板的Transspose函数在调用_Frame()之前更改外观-参见这里的文档http:/andas.pydata.org/大熊猫-docs/dev/generated/panas.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

希望这能帮上忙。



查看完整回答
反对 回复 2019-10-13

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信