从列名称重新索引熊猫数据框

时间:2019-11-13 14:22:01

标签: pandas multi-index

我有一个熊猫数据框,格式如下:

    step    value0     value1_avg  ...   value1_label1   value2_label1  ...  Id
0      0  1.551959       0.579051  ...            0.45        0.700000  ...   1
1      1  1.515447       0.580128  ...            0.00        1.000000  ...   1
2      2  1.481759       0.277778  ...            0.00        1.000000  ...   1
3      0  1.461281       0.277778  ...            0.00        1.000000  ...   2
4      1  1.442006       0.439286  ...            0.20        0.733333  ...   2
5      2  1.415662       0.505467  ...            0.10        0.766667  ...   2
6      0  1.394186       0.515361  ...            0.00        1.000000  ...   3
7      1  1.374112       0.605263  ...            0.00        1.000000  ...   3
8      2  1.350135       0.803030  ...            0.00        1.000000  ...   3

我需要这样重新格式化:

                           Value1  ...          Value1          Value2  ...  
    step    value0            avg  ...          label1          label1  ...  Id
0      0  1.551959       0.579051  ...            0.45        0.700000  ...   1
1      1  1.515447       0.580128  ...            0.00        1.000000  ...   1
2      2  1.481759       0.277778  ...            0.00        1.000000  ...   1
3      0  1.461281       0.277778  ...            0.00        1.000000  ...   2
4      1  1.442006       0.439286  ...            0.20        0.733333  ...   2
5      2  1.415662       0.505467  ...            0.10        0.766667  ...   2
6      0  1.394186       0.515361  ...            0.00        1.000000  ...   3
7      1  1.374112       0.605263  ...            0.00        1.000000  ...   3
8      2  1.350135       0.803030  ...            0.00        1.000000  ...   3

不幸的是,我对熊猫多索引系统有点迷茫。有人可以向我提供一些建议以根据需要重新格式化数据框吗?

非常感谢。

1 个答案:

答案 0 :(得分:2)

我认为最好在'sent'_之间没有MultiIndex in index的所有列中使用,所以如果使用str.split会变得很好MultiIndex in columns

df = df.set_index([c for c in df.columns if '_' not in c])
df.columns = df.columns.str.split('_', expand=True)
print (df)
                    value1           value2
                       avg label1    label1
step value0   Id                           
0    1.551959 1   0.579051   0.45  0.700000
1    1.515447 1   0.580128   0.00  1.000000
2    1.481759 1   0.277778   0.00  1.000000
0    1.461281 2   0.277778   0.00  1.000000
1    1.442006 2   0.439286   0.20  0.733333
2    1.415662 2   0.505467   0.10  0.766667
0    1.394186 3   0.515361   0.00  1.000000
1    1.374112 3   0.605263   0.00  1.000000
2    1.350135 3   0.803030   0.00  1.000000

因为仅使用split会得到非_列名称的缺失值:

df.columns = df.columns.str.split('_', expand=True)
print (df)
  step    value0    value1           value2  Id
   NaN       NaN       avg label1    label1 NaN
0    0  1.551959  0.579051   0.45  0.700000   1
1    1  1.515447  0.580128   0.00  1.000000   1
2    2  1.481759  0.277778   0.00  1.000000   1
3    0  1.461281  0.277778   0.00  1.000000   2
4    1  1.442006  0.439286   0.20  0.733333   2
5    2  1.415662  0.505467   0.10  0.766667   2
6    0  1.394186  0.515361   0.00  1.000000   3
7    1  1.374112  0.605263   0.00  1.000000   3
8    2  1.350135  0.803030   0.00  1.000000   3

但是可以将空字符串设置为level的第一个值,如果不是_

L = [x.split('_') if '_' in x else ['', x] for x in df.columns]
df.columns = pd.MultiIndex.from_tuples(L)
print (df)
                    value1           value2   
  step    value0       avg label1    label1 Id
0    0  1.551959  0.579051   0.45  0.700000  1
1    1  1.515447  0.580128   0.00  1.000000  1
2    2  1.481759  0.277778   0.00  1.000000  1
3    0  1.461281  0.277778   0.00  1.000000  2
4    1  1.442006  0.439286   0.20  0.733333  2
5    2  1.415662  0.505467   0.10  0.766667  2
6    0  1.394186  0.515361   0.00  1.000000  3
7    1  1.374112  0.605263   0.00  1.000000  3
8    2  1.350135  0.803030   0.00  1.000000  3

但是然后使用空字符串也可以选择带有元组的列(但这只是技巧,最好是使用第一个解决方案):

print (df[('','step')])
0    0
1    1
2    2
3    0
4    1
5    2
6    0
7    1
8    2
Name: (, step), dtype: int64