Skip to main content
 首页 » 编程设计

python之Pandas Dataframe 添加缺少的时间戳行,然后向前填充以前的值

2025年05月04日21grandyang

我有一个 Pandas 数据框如下:

Timestamp                    Player Rotated Lat Rotated Lon 
2018-11-11 16:22:21.999993600   G   -15.89769   84.714795 
2018-11-11 16:22:21.999993600   W   -15.897637  84.714784 
2018-11-11 16:22:21.999993600   K   -15.897617  84.714621 
2018-11-11 16:22:21.999993600   Y   -15.897638  84.714787 
2018-11-11 16:22:22.099958400   K   -15.897618  84.714623 
2018-11-11 16:22:22.099958400   Y   -15.897691  84.714796 
2018-11-11 16:22:22.099958400   W   -15.897619  84.714626 
2018-11-11 16:22:22.200009600   Y   -15.897693  84.714794 
2018-11-11 16:22:22.200009600   G   -15.897639  84.714788 
2018-11-11 16:22:22.200009600   K   -15.897693  84.714802 
2018-11-11 16:22:22.299974400   W   -15.897692  84.714796 
2018-11-11 16:22:22.299974400   G   -15.897622  84.714629 
2018-11-11 16:22:22.299974400   Y   -15.897639  84.714791 
2018-11-11 16:22:22.299974400   K   -15.897694  84.714799 
2018-11-11 16:22:22.400025600   G   -15.89764   84.714794 
2018-11-11 16:22:22.400025600   K   -15.897622  84.714632 
2018-11-11 16:22:22.400025600   Y   -15.897692  84.714804 
2018-11-11 16:22:22.400025600   W   -15.897623  84.714635 
2018-11-11 16:22:22.499990400   Y   -15.897692  84.714806 
2018-11-11 16:22:22.499990400   W   -15.897694  84.714802 
2018-11-11 16:22:22.499990400   G   -15.897641  84.714795 
2018-11-11 16:22:22.499990400   K   -15.897694  84.714808 

如果你注意到,我有 4 个玩家:G、W、K、Y。因此每个时间戳索引应该有 4 个。但是,缺少一些时间戳。我如何添加所有缺失的时间戳,然后前向填充其他值以仅获取那些不在给定时间戳中的玩家?

例如,对于时间戳 2018-11-11 16:22:22.099958400,玩家 G 缺失。我怎样才能只填充那个玩家?

期望的输出(我将框架隔开以使其更具可读性):

Timestamp                    Player Rotated Lat Rotated Lon 
2018-11-11 16:22:21.999993600   G   -15.89769   84.714795 
2018-11-11 16:22:21.999993600   W   -15.897637  84.714784 
2018-11-11 16:22:21.999993600   K   -15.897617  84.714621 
2018-11-11 16:22:21.999993600   Y   -15.897638  84.714787 
 
2018-11-11 16:22:22.099958400   K   -15.897618  84.714623 
2018-11-11 16:22:22.099958400   Y   -15.897691  84.714796 
2018-11-11 16:22:22.099958400   W   -15.897619  84.714626 
2018-11-11 16:22:22.099958400   G   -15.89769   84.714795 
 
2018-11-11 16:22:22.200009600   Y   -15.897693  84.714794 
2018-11-11 16:22:22.200009600   G   -15.897639  84.714788 
2018-11-11 16:22:22.200009600   K   -15.897693  84.714802 
2018-11-11 16:22:22.200009600   W   -15.897619  84.714626 

请您参考如下方法:

使用set_index与 unstack对于 reshape ,前向填充缺失值并最后 reshape stack :

df = df.set_index('Player', append=True).unstack().ffill().stack().reset_index(level=1) 
print (df) 
                              Player  Rotated Lat  Rotated Lon 
Timestamp                                                      
2018-11-11 16:22:21.999993600      G   -15.897690    84.714795 
2018-11-11 16:22:21.999993600      K   -15.897617    84.714621 
2018-11-11 16:22:21.999993600      W   -15.897637    84.714784 
2018-11-11 16:22:21.999993600      Y   -15.897638    84.714787 
2018-11-11 16:22:22.099958400      G   -15.897690    84.714795 
2018-11-11 16:22:22.099958400      K   -15.897618    84.714623 
2018-11-11 16:22:22.099958400      W   -15.897619    84.714626 
2018-11-11 16:22:22.099958400      Y   -15.897691    84.714796 
2018-11-11 16:22:22.200009600      G   -15.897639    84.714788 
2018-11-11 16:22:22.200009600      K   -15.897693    84.714802 
2018-11-11 16:22:22.200009600      W   -15.897619    84.714626 
2018-11-11 16:22:22.200009600      Y   -15.897693    84.714794 
2018-11-11 16:22:22.299974400      G   -15.897622    84.714629 
2018-11-11 16:22:22.299974400      K   -15.897694    84.714799 
2018-11-11 16:22:22.299974400      W   -15.897692    84.714796 
2018-11-11 16:22:22.299974400      Y   -15.897639    84.714791 
2018-11-11 16:22:22.400025600      G   -15.897640    84.714794 
2018-11-11 16:22:22.400025600      K   -15.897622    84.714632 
2018-11-11 16:22:22.400025600      W   -15.897623    84.714635 
2018-11-11 16:22:22.400025600      Y   -15.897692    84.714804 
2018-11-11 16:22:22.499990400      G   -15.897641    84.714795 
2018-11-11 16:22:22.499990400      K   -15.897694    84.714808 
2018-11-11 16:22:22.499990400      W   -15.897694    84.714802 
2018-11-11 16:22:22.499990400      Y   -15.897692    84.714806