在pandas中设置多列索引

时间:2016-12-18 13:05:03

标签: python pandas numpy

我像这样制作数据帧。

df = pd.DataFrame({
    'class' : ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'],
    'number' : [1,2,3,4,5,1,2,3,4,5],
    'math' : [90, 20, 50, 30, 57, 67, 89, 79, 45, 23],
    'english' : [40, 21, 68, 89, 90, 87, 89, 54, 21, 23]
})

我希望通过使用一些pandas方法将索引转换为此。(例如set_index,stack ,,,)

df1 = pd.DataFrame(np.random.randint(1, 100, (5, 4)),
             columns = [['A', 'A', 'B', 'B'],['english', 'math', 'english', 'math']],
             index = [1, 2, 3, 4, 5])

我该怎么做?

2 个答案:

答案 0 :(得分:11)

我认为您需要set_indexunstack进行重新整形,然后在swaplevel列中的MultiIndexsort_index的最后排序列中交换级别:< / p>

df1 = df.set_index(['number','class']).unstack().swaplevel(0,1,1).sort_index(1)

print (df1)
class        A            B     
       english math english math
number                          
1           40   90      87   67
2           21   20      89   89
3           68   50      54   79
4           89   30      21   45
5           90   57      23   23

stackunstack的另一种解决方案:

print (df.set_index(['number','class']).stack().unstack([1,2]))
class        A            B     
       english math english math
number                          
1           40   90      87   67
2           21   20      89   89
3           68   50      54   79
4           89   30      21   45
5           90   57      23   23

答案 1 :(得分:5)

我喜欢@jezrael回答很多,但为了完整起见 - 您还可以使用pandas.DataFrame.pivot_table代替set_index + unstack

>>> df.pivot_table(index='number', columns='class').swaplevel(axis=1).sort_index(1)
class        A            B     
       english math english math
number                          
1           40   90      87   67
2           21   20      89   89
3           68   50      54   79
4           89   30      21   45
5           90   57      23   23