如何对带有多重索引的Pandas DataFrame进行位移?
给定下面这个数据表(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
如果你有多重索引,可以通过给 groupby
的 level
参数传递一系列的 ints
或者级别名称,来按多个层级进行分组。