通过拆分索引名称将1D大熊猫DataFrame重新排列为2d

时间:2019-02-01 15:42:24

标签: python pandas

我有一个1D DataFrame,它以i_n形式的键索引,其中in是字符串(在本示例中,i是字符串一个整数,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

现在,我想将此DataFrame重新排列为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),但我想知道,是否有一种更惯用的方式来实现这一目标。这里是用于生成原始DataFrame并将其转换为所需形式的代码:

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))

关于索引键的一些注意事项:可以假设(例如在我的函数中)没有“缺失键”(即始终可以实现2d数组),并且唯一可以认为是密钥是(单个)下划线(即,数字和字母仅是出于解释原因而选择,实际上,下划线仅连接了两个任意字符串)。

1 个答案:

答案 0 :(得分:5)

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