如何在Pandas中重新索引数据框?

时间:2019-03-21 22:13:05

标签: python pandas dataframe

我在Python中使用pandas,并且执行了一些交叉表计算和连接,最后得到的数据框如下所示:

ID        5    6    7    8     9    10   11   12    13
Total     87.0  3.0  9.0  6.0  92.0  7.0  3.0  3.0  20.0
Regular   72.0  2.0  8.0  5.0  81.0  7.0  3.0  3.0  18.0
CR        22.0  0.0  0.0  0.0  17.0  0.0  0.0  0.0   3.0
HDG       20.0  0.0  0.0  0.0  24.0  4.0  0.0  0.0   1.0
PPG       30.0  2.0  8.0  5.0  40.0  3.0  3.0  3.0  14.0
Superior  15.0  1.0  1.0  1.0  11.0  0.0  0.0  0.0   2.0
CR         3.0  0.0  0.0  0.0   2.0  0.0  0.0  0.0   0.0
HDG        5.0  1.0  1.0  1.0   4.0  0.0  0.0  0.0   0.0
PPG        7.0  0.0  0.0  0.0   5.0  0.0  0.0  0.0   2.0

问题是我希望以Superior开始的最后4行放在Total行之前。因此,我只想用从Regular开始的4行切换最后4行的位置。如何在pandas中做到这一点?这样我就知道了:

ID        5    6    7    8     9    10   11   12    13
Total     87.0  3.0  9.0  6.0  92.0  7.0  3.0  3.0  20.0
Superior  15.0  1.0  1.0  1.0  11.0  0.0  0.0  0.0   2.0
CR         3.0  0.0  0.0  0.0   2.0  0.0  0.0  0.0   0.0
HDG        5.0  1.0  1.0  1.0   4.0  0.0  0.0  0.0   0.0
PPG        7.0  0.0  0.0  0.0   5.0  0.0  0.0  0.0   2.0
Regular   72.0  2.0  8.0  5.0  81.0  7.0  3.0  3.0  18.0
CR        22.0  0.0  0.0  0.0  17.0  0.0  0.0  0.0   3.0
HDG       20.0  0.0  0.0  0.0  24.0  4.0  0.0  0.0   1.0
PPG       30.0  2.0  8.0  5.0  40.0  3.0  3.0  3.0  14.0

3 个答案:

答案 0 :(得分:2)

更通用的解决方案Categoricalargsort,我知道这个df是有序的,所以ffill在这里是安全的

s=df.ID
s=s.where(s.isin(['Total','Regular','Superior'])).ffill()
s=pd.Categorical(s,['Total','Superior','Regular'],ordered=True)
df=df.iloc[np.argsort(s)]
df
Out[188]: 
         ID     5    6    7    8     9   10   11   12    13
0     Total  87.0  3.0  9.0  6.0  92.0  7.0  3.0  3.0  20.0
5  Superior  15.0  1.0  1.0  1.0  11.0  0.0  0.0  0.0   2.0
6        CR   3.0  0.0  0.0  0.0   2.0  0.0  0.0  0.0   0.0
7       HDG   5.0  1.0  1.0  1.0   4.0  0.0  0.0  0.0   0.0
8       PPG   7.0  0.0  0.0  0.0   5.0  0.0  0.0  0.0   2.0
1   Regular  72.0  2.0  8.0  5.0  81.0  7.0  3.0  3.0  18.0
2        CR  22.0  0.0  0.0  0.0  17.0  0.0  0.0  0.0   3.0
3       HDG  20.0  0.0  0.0  0.0  24.0  4.0  0.0  0.0   1.0
4       PPG  30.0  2.0  8.0  5.0  40.0  3.0  3.0  3.0  14.0

答案 1 :(得分:1)

这是一种方法:

import numpy as np
df.iloc[1:,:] = np.roll(df.iloc[1:,:].values, 4, axis=0)

       ID     5     6    7    8     9   10   11   12    13
0     Total  87.0  3.0  9.0  6.0  92.0  7.0  3.0  3.0  20.0
1  Superior  15.0  1.0  1.0  1.0  11.0  0.0  0.0  0.0   2.0
2        CR   3.0  0.0  0.0  0.0   2.0  0.0  0.0  0.0   0.0
3       HDG   5.0  1.0  1.0  1.0   4.0  0.0  0.0  0.0   0.0
4       PPG   7.0  0.0  0.0  0.0   5.0  0.0  0.0  0.0   2.0
5   Regular  72.0  2.0  8.0  5.0  81.0  7.0  3.0  3.0  18.0
6        CR  22.0  0.0  0.0  0.0  17.0  0.0  0.0  0.0   3.0
7       HDG  20.0  0.0  0.0  0.0  24.0  4.0  0.0  0.0   1.0
8       PPG  30.0  2.0  8.0  5.0  40.0  3.0  3.0  3.0  14.0

答案 2 :(得分:1)

有关此问题的具体答案,只需使用iloc

df.iloc[[0,5,6,7,8,1,2,3,4],:]

有关更通用的解决方案,

m = (df.ID.eq('Superior') | df.ID.eq('Regular')).cumsum()
pd.concat([df[m==0], df[m==2], df[m==1]])

order = (2,1)
pd.concat([df[m==0], *[df[m==c] for c in order]])

其中order定义了从先前顺序到新顺序的映射。