代码之家  ›  专栏  ›  技术社区  ›  Spinor8

从一组单独的序列构造熊猫多索引数据帧

  •  0
  • Spinor8  · 技术社区  · 6 年前

    我计算了一组个体大熊猫系列,它们有一个共同的指数。我想从中构建一个熊猫多索引框架。下面是我想要的结构。

                            X         Y         Z       
    DATE                                                      
    2018-01-01 A           NaN       NaN       NaN      
               B           NaN       NaN       NaN      
               C           NaN       NaN       NaN      
    2018-01-02 A           NaN       NaN       NaN       
               B           NaN       NaN       NaN      
               C           NaN       NaN       NaN       
    

    所以(:,a,x)是一个系列。(:,A,Y)另一个等等。我该怎么办?

    下面是我所拥有的

    import pandas as pd
    import numpy as np
    idx = pd.date_range("20180101", periods=10)
    s_1 = pd.Series(np.random.randint(0,10,size=10), index=idx)
    s_2 = pd.Series(np.random.randint(0,10,size=10), index=idx)
    s_3 = .... all the way to s9
    

    编辑:假设我想把S_1映射到(a,x),S_2映射到(a,y),S_3映射到(a,z),S_4映射到(b,x)等。

    1 回复  |  直到 6 年前
        1
  •  0
  •   ALollz    6 年前

    您需要首先向 Series 您提供了它们所属的列和多索引级别:

    def add_idx_and_name(s, idx_name, col_name):
        #Create multi-index DataFrames from s
        s = s.reset_index()
        s['idx'] = idx_name
        s = s.set_index(['index', 'idx'])
        s.rename(columns={0: col_name}, inplace=True)
    
        return s
    

    然后将这些信息添加到您的系列中(它们现在是 DataFrame S):

    s_1 = add_idx_and_name(s_1, 'A', 'X')
    s_2 = add_idx_and_name(s_2, 'A', 'Y')
    s_3 = add_idx_and_name(s_3, 'A', 'Z')
    s_4 = add_idx_and_name(s_4, 'B', 'X')
    ....
    

    然后连接

    pd.concat([pd.concat([s_1, s_2, s_3], axis=1), 
               pd.concat([s_4, s_5, s_6], axis=1),
               pd.concat([s_7, s_8, s_9], axis=1)]).sort_index()
    

    输出(我使用 np.random.seed(123) )

                    X  Y  Z
    index      idx         
    2018-01-01 A    2  9  7
               B    9  3  0
               C    2  0  2
    2018-01-02 A    2  0  3
               B    3  5  6
               C    4  8  3
    2018-01-03 A    6  0  2
               B    4  0  4
               C    8  1  3
    ...