如何使用多索引转换Pandas DataFrame?

Tra*_*VOX 24 python pandas

使用以下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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

问题在于Paynter被授予了最后枪手(他的第一张唱片)的指定.相反,我希望它像这样......

                  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
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 42

使用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
Run Code Online (Sandbox Code Playgroud)

如果您有多索引,则可以通过将一系列ints或级别名称传递给groupby's level参数来分组多个级别.

  • 此示例已添加到[食谱](http://pandas.pydata.org/pandas-docs/stable/cookbook.html#grouping)中。 (2认同)