如何对带有多重索引的Pandas DataFrame进行位移?

39 投票
1 回答
24817 浏览
提问于 2025-04-18 03:36

给定下面这个数据表(DataFrame),我想知道怎么能根据索引来移动“beyer”这一列的值,而不让Pandas把移动后的值分配到不同的索引上。

                  line_date  line_race  beyer
horse                                        
Last Gunfighter  2013-09-28         10     99
Last Gunfighter  2013-08-18         10    102
Last Gunfighter  2013-07-06          8    103
.....
Paynter          2013-09-28         10    103
Paynter          2013-08-31         10     88
Paynter          2013-07-27          8    100

df['beyer'].shift(1) 这样做会得到...

                  line_date  line_race  beyer  beyer_shifted
horse                                                       
Last Gunfighter  2013-09-28         10     99            NaN
Last Gunfighter  2013-08-18         10    102             99
Last Gunfighter  2013-07-06          8    103            102
.....
Paynter          2013-09-28         10    103             71
Paynter          2013-08-31         10     88            103
Paynter          2013-07-27          8    100             88

问题在于,Paynter得到了一个“beyer”值,这个值是给Last Gunfighter(他的第一条记录)的。我希望它能这样移动...

                  line_date  line_race  beyer  beyer_shifted
horse                                                       
Last Gunfighter  2013-09-28         10     99            NaN
Last Gunfighter  2013-08-18         10    102             99
Last Gunfighter  2013-07-06          8    103            102
.....
Paynter          2013-09-28         10    103            NaN
Paynter          2013-08-31         10     88            103
Paynter          2013-07-27          8    100             88

1 个回答

61

使用 groupby/shift 可以对每个组单独进行位移操作:(感谢Jeff指出这个简化的方法。)

In [60]: df['beyer_shifted'] = df.groupby(level=0)['beyer'].shift(1); df
Out[61]: 
                  line_date  line_race  beyer  beyer_shifted
Last Gunfighter  2013-09-28         10     99            NaN
Last Gunfighter  2013-08-18         10    102             99
Last Gunfighter  2013-07-06          8    103            102
Paynter          2013-09-28         10    103            NaN
Paynter          2013-08-31         10     88            103
Paynter          2013-07-27          8    100             88

如果你有多重索引,可以通过给 groupbylevel 参数传递一系列的 ints 或者级别名称,来按多个层级进行分组。

撰写回答