如何用多级索引来转换 Pandas DataFrame?

39

有了以下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被赋予了一个与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 将移位操作应用于每个分组:

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
如果你有一个多级索引,你可以通过将 int 或级别名称序列传递给 groupbylevel 参数来按多个级别分组。

我认为我们应该把这个加入到食谱中。你有时间的话能否提交一个PR? - Jeff
为什么会出现这个错误... ValueError: 无法从重复的轴重新索引 - TravisVOX
某些操作需要索引中没有重复的条目。由于此错误可能以多种方式发生,如果您能提供表现问题的示例将会很有帮助。 - unutbu
3
这个例子已被添加到食谱中。 - unutbu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接