如何将嵌套字典转换为数据框?

4

我有一个嵌套字典。它是一些纳斯达克类型的数据。就像这样:

{'CLSN':     
 Date        Open  High   Low  Close  Volume  Adj Close                                                
 2015-12-31  1.92  1.99  1.87   1.92   79600       1.92
 2016-01-04  1.93  1.99  1.87   1.93   39700       1.93
 2016-01-05  1.89  1.94  1.85   1.90   50200       1.90,
 'CCC':    
 Date            Open       High        Low      Close  Volume  Adj Close                                                              
 2015-12-31  17.270000  17.389999  17.120001  17.250000  177200  16.965361
 2016-01-04  17.000000  17.219999  16.600000  17.180000  371600  16.896516
 2016-01-05  17.190001  17.530001  17.059999  17.450001  417500  17.162061,
}

为了帮助您理解,这是“键”后跟着“值”,“值”是一个“dataframe(数据框架)”!在提问之前,我尝试了“pd.Panel(nas)['CLSN']”这种方式,所以我确定它的值是一个数据框架。但是“pd.Panel(nas).to_frame().reset_index()”这种方式对我没有帮助!它输出了一个空的数据框架,并且有成千上万个由股票名称填充的列。
现在这让我很困扰,我想要的是像这样的数据框架:
index  Date      Open       High       Low       Close      Volume     Adj Close                                            CLSN 2015-12-31  1.92       1.99       1.87       1.92       79600.0   1.92
CLSN 2016-01-01   NaN       NaN        NaN        NaN        NaN       NaN
ClSN 2016-01-04  1.93       1.99       1.87       1.93       39700.0   1.93  
CCC  2015-12-31  17.270000  17.389999  17.120001  17.250000  177200.0  16.965361
CCC  2016-01-04  17.000000  17.219999  16.600000  17.180000  371600.0  16.896516
CCC  2016-01-05  17.190001  17.530001  17.059999  17.450001  417500.0  17.162061

当然,我可以使用for循环来获取每个股票的数据框,但是将它们全部连接在一起让我感到困扰。

你有更好的想法吗?非常愿意知道!


给MaxU:

使用方法print(nas['CLSN'].head())后,输出如下:

            Open  High   Low  Close  Volume  Adj Close
Date                                                  
2015-12-31  1.92  1.99  1.87   1.92   79600       1.92
2016-01-04  1.93  1.99  1.87   1.93   39700       1.93
2016-01-05  1.89  1.94  1.85   1.90   50200       1.90
2016-01-06  1.86  1.89  1.77   1.78   62100       1.78
2016-01-07  1.75  1.80  1.75   1.77  117000       1.77
2个回答

3

更新:

假设Date是一个索引(不是常规列):

源字典:

In [70]: d2
Out[70]:
{'CCC':                  Open       High        Low      Close  Volume  Adj Close
 Date
 2015-12-31  17.270000  17.389999  17.120001  17.250000  177200  16.965361
 2016-01-04  17.000000  17.219999  16.600000  17.180000  371600  16.896516
 2016-01-05  17.190001  17.530001  17.059999  17.450001  417500  17.162061,
 'CLSN':             Open  High   Low  Close  Volume  Adj Close
 Date
 2015-12-31  1.92  1.99  1.87   1.92   79600       1.92
 2016-01-04  1.93  1.99  1.87   1.93   39700       1.93
 2016-01-05  1.89  1.94  1.85   1.90   50200       1.90}

解决方案:

In [73]: pd.Panel(d2).swapaxes(0, 2).to_frame().reset_index(level=0).sort_index()
Out[73]:
            Date       Open       High        Low      Close    Volume  Adj Close
minor
CCC   2015-12-31  17.270000  17.389999  17.120001  17.250000  177200.0  16.965361
CCC   2016-01-04  17.000000  17.219999  16.600000  17.180000  371600.0  16.896516
CCC   2016-01-05  17.190001  17.530001  17.059999  17.450001  417500.0  17.162061
CLSN  2015-12-31   1.920000   1.990000   1.870000   1.920000   79600.0   1.920000
CLSN  2016-01-04   1.930000   1.990000   1.870000   1.930000   39700.0   1.930000
CLSN  2016-01-05   1.890000   1.940000   1.850000   1.900000   50200.0   1.900000

或者,您可以将 Date 保留为索引的一部分:

In [74]: pd.Panel(d2).swapaxes(0, 2).to_frame().sort_index()
Out[74]:
                       Open       High        Low      Close    Volume  Adj Close
Date       minor
2015-12-31 CCC    17.270000  17.389999  17.120001  17.250000  177200.0  16.965361
           CLSN    1.920000   1.990000   1.870000   1.920000   79600.0   1.920000
2016-01-04 CCC    17.000000  17.219999  16.600000  17.180000  371600.0  16.896516
           CLSN    1.930000   1.990000   1.870000   1.930000   39700.0   1.930000
2016-01-05 CCC    17.190001  17.530001  17.059999  17.450001  417500.0  17.162061
           CLSN    1.890000   1.940000   1.850000   1.900000   50200.0   1.900000
旧的回答 - 它假设Date是一个常规列(而不是索引) 试试这个:
In [59]: pd.Panel(d).swapaxes(0, 2).to_frame().reset_index('major', drop=True).sort_index()
Out[59]:
            Date   Open   High    Low  Close  Volume Adj Close
minor
CCC   2015-12-31  17.27  17.39  17.12  17.25  177200   16.9654
CCC   2016-01-04     17  17.22   16.6  17.18  371600   16.8965
CCC   2016-01-05  17.19  17.53  17.06  17.45  417500   17.1621
CLSN  2015-12-31   1.92   1.99   1.87   1.92   79600      1.92
CLSN  2016-01-04   1.93   1.99   1.87   1.93   39700      1.93
CLSN  2016-01-05   1.89   1.94   1.85    1.9   50200       1.9

其中d是您的嵌套字典

In [60]: d
Out[60]:
{'CCC':         Date       Open       High        Low      Close  Volume  Adj Close
 0 2015-12-31  17.270000  17.389999  17.120001  17.250000  177200  16.965361
 1 2016-01-04  17.000000  17.219999  16.600000  17.180000  371600  16.896516
 2 2016-01-05  17.190001  17.530001  17.059999  17.450001  417500  17.162061,
 'CLSN':         Date  Open  High   Low  Close  Volume  Adj Close
 0 2015-12-31  1.92  1.99  1.87   1.92   79600       1.92
 1 2016-01-04  1.93  1.99  1.87   1.93   39700       1.93
 2 2016-01-05  1.89  1.94  1.85   1.90   50200       1.90}

@PanKevin,你也可以使用reset_index(level = 0,drop = True)。但是很奇怪,因为我希望在执行reset_index()之后会有一个“major”列... - MaxU - stand with Ukraine
太棒了!所有输出都是次要的,但日期列却缺失了...就像这样:minor Open High Low Close Volume Adj Close A 41.900002 42.349998 41.720001 41.810001 1449300.0 41.357005 A 37.369999 37.950001 37.000000 37.689999 2666200.0 37.281641 A 37.400002 38.029999 37.400002 37.610001 1831200.0 37.202510 A 40.240002 40.990002 40.049999 40.730000 2103600.0 40.288705 ,你能解释一下吗? - Pan Kevin
我已经发布了它,我完全同意Date列是DF的索引。在我发布问题之前,我对输出进行了一些编辑,如果这让你感到困惑,我真的很抱歉... - Pan Kevin
我的天啊!它成功了!就像我想要的一样: 日期 开盘价 最高价 最低价 收盘价 成交量 \ minor A 2015-12-31 41.900002 42.349998 41.720001 41.810001 1449300.0 A 2016-02-01 37.369999 37.950001 37.000000 37.689999 2666200.0 A 2016-01-25 37.400002 38.029999 37.400002 37.610001 1831200.0 A 2016-01-06 40.240002 40.990002 40.049999 40.730000 2103600.0 谢谢@MaxU,谢谢你,你救了我的命!!! - Pan Kevin
@PanKevin,很高兴我能帮到你。谢谢您接受答案! :-) - MaxU - stand with Ukraine
显示剩余3条评论

2
也许 pandas.concat 是您需要的:
In [8]: data = dict(A=pd.DataFrame([[1,2], [3,4]], columns=['X', 'Y']),
                    B=pd.DataFrame([[1,2], [3,4]], columns=['X', 'Y']),)

In [9]: data
Out[9]: 
{'A':    X  Y
 0  1  2
 1  3  4, 
 'B':    X  Y
 0  1  2
 1  3  4}

In [10]: pd.concat(data)
Out[10]: 
     X  Y
A 0  1  2
  1  3  4
B 0  1  2
  1  3  4

谢谢,但Python运行时间太长以至于无法输出结果。我使用了这个代码:df = pd.concat(pd.Panel(nas)[k] for k in nas.keys()),但它一直在运行。 - Pan Kevin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接