代码之家  ›  专栏  ›  技术社区  ›  Thomas Kühn

通过拆分索引名称将1d pandas数据帧重新排列为2d

  •  2
  • Thomas Kühn  · 技术社区  · 7 年前

    我有一个1d数据帧,它用窗体的键索引。 i_n 在哪里 i n 是字符串(为了这个例子, 是整数,并且 n 是一个字符)。这是一个简单的例子:

           values
    0_a  0.583772
    1_a  0.782358
    2_a  0.766844
    3_a  0.072565
    4_a  0.576667
    0_b  0.503876
    1_b  0.352815
    2_b  0.512834
    3_b  0.070908
    4_b  0.074875
    0_c  0.361226
    1_c  0.526089
    2_c  0.299183
    3_c  0.895878
    4_c  0.874512
    

    现在,我想将这个数据框架重新安排为2d,这样数字(在下划线之前的索引名称部分)用作列名,字符(在下划线之后的索引部分)用作索引:

              0         1         2          3          4
    a  0.583772  0.782358  0.766844  0.0725654   0.576667
    b  0.503876  0.352815  0.512834  0.0709081  0.0748752
    c  0.361226  0.526089  0.299183   0.895878   0.874512
    

    我有一个解决问题的方法(函数 convert_2d 但我想知道是否有一种更习惯的方法来实现这一点。这里是用于生成原始数据帧并将其转换为所需格式的代码:

    import pandas as pd
    import numpy as np
    
    def convert_2d(df):
        df2 = pd.DataFrame(columns=['a','b','c'], index=list(range(5))).T
    
        names = set(idx.split('_')[1] for idx in df.index)
        numbers = set(idx.split('_')[0] for idx in df.index)
    
        for i in numbers:
            for n in names:
                df2[i][n] = df['values']['{}_{}'.format(i,n)]
    
        return df2
    
    
    
    ##generating 1d example data:
    data = np.random.rand(15)
    indices = ['{}_{}'.format(i,n) for n in ['a','b','c'] for i in range(5)]
    df = pd.DataFrame(
        data, columns=['values']
    ).rename(index={i:idx for i,idx in enumerate(indices)})
    
    print(df)
    
    ##converting to 2d
    print(convert_2d(df))
    

    关于索引键的一些注意事项:可以假定(就像在我的函数中一样)没有“丢失的键”(即总是可以实现二维数组),并且对于键来说,唯一可以想当然的是(单个)下划线(即,数字和字母仅是出于解释原因而选择的,实际上只有两个arbi用下划线连接的字符串)。

    1 回复  |  直到 7 年前
        1
  •  5
  •   BENY    7 年前

    iiuc创建多个索引,然后 unstack

    df.index=pd.MultiIndex.from_tuples(df.index.str.split('_').map(tuple))
    df['values'].unstack(level=0)
    Out[65]: 
    
              0         1         2         3         4
    a  0.583772  0.782358  0.766844  0.072565  0.576667
    b  0.503876  0.352815  0.512834  0.070908  0.074875
    c  0.361226  0.526089  0.299183  0.895878  0.874512