首先介紹reindex,它的作用是創建一個新對象,新對象的數據符合新的索引。示例如下所示
從上圖可以看出,使用reindex後,索引進行了重排。如果某個索引值不存在,就會引入缺失值:
如果不想使用缺失值,可以通過fill_value參數填充默認值,如下所示
同時也可以使用method選項,使用method時,可用的參數包括ffill(前向填充)和bfill(後向填充)。
在使用method選項時,你可能會發現ffill或bfill填充的值與預期的值不符,如下圖所示:
本來認爲‘o’索引填充的值應該是3,但上面填充的卻是4,這是爲什麼呢?
因爲在reindex的括號內部使用method選項時:先按照索引的順序排序好,然後再填充值,填充完成後再按照reindex裏新索引的順序進行排列。
因此obj先按照a,b,c,d,o的順序排列好,d的值是4, o的值就被前向填充成4了。
同理,如果使用bfill參數,因爲o後面沒有值了,o的值就是NaN,而不是2。如下圖所示
但是如果使用.ffill()或.bfill(),就能夠達到我們想要的效果:填充值與前向/後項值相同。如下圖所示:
同時需要注意的是,在使用method選項時,原數組裏的索引必須是已經經過排序的,如果原索引是亂序的,會彈出如下錯誤
index must be monotonic increasing or decreasing
如下所示obj3的原索引未按順序排列:
如果此時使用method選項,就會報錯:
但使用.ffill()就不會有問題:
使用method方式是舊python的做法,新版python中推薦使用.ffill()方式。
通過reindex還可以選擇特定的索引:
對於DataFrame,reindex可以修改行索引或列索引。如果只傳遞一個序列,則會修改行索引:
用columns關鍵字就可以重新索引列。
通過本文的學習,你是否學會了reindex的用法?