【问题标题】:Python: Reshaping a dataframe with multiple indexesPython:重塑具有多个索引的数据框
【发布时间】:2019-02-16 08:36:48
【问题描述】:

假设我们有一个这样的 DataFrame:

In[1]: operinc_df
Out[1] :

        ticker1     ticker2      ticker3
    0   0.343573    0.654719    0.246643
    1   0.186861    0.219793    0.761056
    2   0.417347    0.058368    0.684918
    3   0.803177    0.014781    0.896704
    4   0.294515    0.488001    0.291187
    5   0.402278    0.368005    0.821096
    6   0.985514    0.378000    0.929529
    7   1.168360    0.729640    0.347064
    8   0.025802    1.337121    0.638399
    9   0.019182    2.257563    0.041164

我们还有另一个具有相同行数和列数(同名)的 DataFrame:

In[2]: opex_df
Out[2] :


     ticker1    ticker2      ticker3
0   1.450770    0.227986    2.243050
1   1.212298    0.406004    1.212320
2   0.918931    0.677043    0.361878
3   0.566981    1.155675    0.295542
4   0.600614    0.872015    1.129760
5   0.470118    0.730027    1.112045
6   1.489904    0.522885    0.475244
7   1.626853    0.142996    0.758590
8   0.290340    1.175891    0.591020
9   1.472838    0.107094    0.715764

我不知道如何创建另一个由operinc_dfopex_df 组成的DataFrame fundamentals,使其看起来像下面的DataFrame(可能具有两级索引):

In[3]: fundamentals
Out[3] :




              operinc_df    opex_df 
ticker1   0    0.343573    1.450770
ticker1   1    0.186861    1.212298
.         .    .           .
.         .    .           .
.         .    .           .
ticker1   9    0.019182    1.472838
ticker2   0    0.654719    0.227986
ticker2   1    0.219793    0.406004
.         .    .           .
.         .    .           .
.         .    .           .
ticker2   9    2.257563    0.107094
ticker3   0    0.246643    2.243050
ticker3   1    0.761056    1.212320
.         .    .           .
.         .    .           .
.         .    .           .
ticker3   9    0.041164    0.715764

阅读Reshaping dataframes in pandas based on column labelsCreate a pandas DataFrame from multiple dicts 给了我一些见解(因为我也试图通过首先将原始DataFrames 转换为dicts 来做到这一点,用字典理解的键打包operinc_dfopex_df,然后使用pandas.DataFrame.from_dict() 尝试创建fundamentals_df。不过,到目前为止它对我来说并没有成功。

您对我如何正确执行此操作有任何想法吗?非常感谢您。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以连接转置的数据帧,

    new_df = pd.concat([operinc_df.T, opex_df.T], axis = 1, keys=['operinc_df', 'opex_df']).stack()
    
    
                operinc_df  opex_df
    ticker1 0   0.343573    1.450770
            1   0.186861    1.212298
            2   0.417347    0.918931
            3   0.803177    0.566981
            4   0.294515    0.600614
            5   0.402278    0.470118
            6   0.985514    1.489904
            7   1.168360    1.626853
            8   0.025802    0.290340
            9   0.019182    1.472838
    ticker2 0   0.654719    0.227986
            1   0.219793    0.406004
            2   0.058368    0.677043
            3   0.014781    1.155675
            4   0.488001    0.872015
            5   0.368005    0.730027
            6   0.378000    0.522885
            7   0.729640    0.142996
            8   1.337121    1.175891
            9   2.257563    0.107094
    ticker3 0   0.246643    2.243050
            1   0.761056    1.212320
            2   0.684918    0.361878
            3   0.896704    0.295542
            4   0.291187    1.129760
            5   0.821096    1.112045
            6   0.929529    0.475244
            7   0.347064    0.758590
            8   0.638399    0.591020
            9   0.041164    0.715764
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      fundamentals = (operinc_df.stack().rename('operinc_df').to_frame()
                      .join(opex_df.stack().rename('opex_df'))
                      .swaplevel().sort_index())
      
      >>> fundamentals
      
                 operinc_df   opex_df
      ticker1 0    0.343573  1.450770
              1    0.186861  1.212298
              2    0.417347  0.918931
              3    0.803177  0.566981
              4    0.294515  0.600614
              5    0.402278  0.470118
              6    0.985514  1.489904
              7    1.168360  1.626853
              8    0.025802  0.290340
              9    0.019182  1.472838
      ticker2 0    0.654719  0.227986
              1    0.219793  0.406004
              2    0.058368  0.677043
              3    0.014781  1.155675
              4    0.488001  0.872015
              5    0.368005  0.730027
              6    0.378000  0.522885
              7    0.729640  0.142996
              8    1.337121  1.175891
              9    2.257563  0.107094
      ticker3 0    0.246643  2.243050
              1    0.761056  1.212320
              2    0.684918  0.361878
              3    0.896704  0.295542
              4    0.291187  1.129760
              5    0.821096  1.112045
              6    0.929529  0.475244
              7    0.347064  0.758590
              8    0.638399  0.591020
              9    0.041164  0.715764
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-07
        • 2021-02-24
        • 2017-08-20
        • 2017-12-14
        • 1970-01-01
        • 1970-01-01
        • 2021-12-02
        • 2019-06-30
        相关资源
        最近更新 更多