python——dataframe向下向上填充,fillna和ffill
阿新 • • 發佈:2019-01-10
首先新建一個dataframe:
將date列改為時間型別:
資料的含義是這樣的,我們有ABCD四個人的資料,已知A在2010-01-01的時候,名下有1套房,B在2010-06-09的時候,名下有1套房,C在2011-12-03的時候,有2套房,D在2011-04-05的時候有3套房,A在2012-02-23的時候,資料更新了,有兩套房。
In[8]: df = pd.DataFrame({'name':list('ABCDA'),'house':[1,1,2,3,3],'date':['2010-01-01','2010-06-09','2011-12-03','2011-04-05','2012-03-23']}) In[9]: df Out[9]: date house name 0 2010-01-01 1 A 1 2010-06-09 1 B 2 2011-12-03 2 C 3 2011-04-05 3 D 4 2012-03-23 3 A
將date列改為時間型別:
In[12]: df.date = pd.to_datetime(df.date)
資料的含義是這樣的,我們有ABCD四個人的資料,已知A在2010-01-01的時候,名下有1套房,B在2010-06-09的時候,名下有1套房,C在2011-12-03的時候,有2套房,D在2011-04-05的時候有3套房,A在2012-02-23的時候,資料更新了,有兩套房。
要求在有姓名和時間的情況下,能給出其名下有幾套房:
比如A在2010-01-01與2012-03-23期間任意一天,都應該是1套房,在2012-03-23之後,都是3套房。
我們使用pandas的fillna方法,選擇ffill。
首先我們獲得一個2010-01-01到2017-12-01的dataframe
然後用上上篇部落格中提到的pivot_table將原本的df轉變之後,與time_range進行merger操作。In[14]: time_range = pd.DataFrame( pd.date_range('2010-01-01','2017-12-01',freq='D'), columns=['date']).set_index("date") In[15]: time_range Out[15]: Empty DataFrame Columns: [] Index: [2010-01-01 00:00:00, 2010-01-02 00:00:00, 2010-01-03 00:00:00, 2010-01-04 00:00:00, 2010-01-05 00:00:00, 2010-01-06 00:00:00, 2010-01-07 00:00:00, 2010-01-08 00:00:00, 2010-01-09 00:00:00, 2010-01-10 00:00:00, 2010-01-11 00:00:00, 2010-01-12 00:00:00, 2010-01-13 00:00:00, 2010-01-14 00:00:00, 2010-01-15 00:00:00, 2010-01-16 00:00:00, 2010-01-17 00:00:00, 2010-01-18 00:00:00, 2010-01-19 00:00:00, 2010-01-20 00:00:00, 2010-01-21 00:00:00, 2010-01-22 00:00:00, 2010-01-23 00:00:00, 2010-01-24 00:00:00, 2010-01-25 00:00:00, 2010-01-26 00:00:00, 2010-01-27 00:00:00, 2010-01-28 00:00:00, 2010-01-29 00:00:00, 2010-01-30 00:00:00, 2010-01-31 00:00:00, 2010-02-01 00:00:00, 2010-02-02 00:00:00, 2010-02-03 00:00:00, 2010-02-04 00:00:00, 2010-02-05 00:00:00, 2010-02-06 00:00:00, 2010-02-07 00:00:00, 2010-02-08 00:00:00, 2010-02-09 00:00:00, 2010-02-10 00:00:00, 2010-02-11 00:00:00, 2010-02-12 00:00:00, 2010-02-13 00:00:00, 2010-02-14 00:00:00, 2010-02-15 00:00:00, 2010-02-16 00:00:00, 2010-02-17 00:00:00, 2010-02-18 00:00:00, 2010-02-19 00:00:00, 2010-02-20 00:00:00, 2010-02-21 00:00:00, 2010-02-22 00:00:00, 2010-02-23 00:00:00, 2010-02-24 00:00:00, 2010-02-25 00:00:00, 2010-02-26 00:00:00, 2010-02-27 00:00:00, 2010-02-28 00:00:00, 2010-03-01 00:00:00, 2010-03-02 00:00:00, 2010-03-03 00:00:00, 2010-03-04 00:00:00, 2010-03-05 00:00:00, 2010-03-06 00:00:00, 2010-03-07 00:00:00, 2010-03-08 00:00:00, 2010-03-09 00:00:00, 2010-03-10 00:00:00, 2010-03-11 00:00:00, 2010-03-12 00:00:00, 2010-03-13 00:00:00, 2010-03-14 00:00:00, 2010-03-15 00:00:00, 2010-03-16 00:00:00, 2010-03-17 00:00:00, 2010-03-18 00:00:00, 2010-03-19 00:00:00, 2010-03-20 00:00:00, 2010-03-21 00:00:00, 2010-03-22 00:00:00, 2010-03-23 00:00:00, 2010-03-24 00:00:00, 2010-03-25 00:00:00, 2010-03-26 00:00:00, 2010-03-27 00:00:00, 2010-03-28 00:00:00, 2010-03-29 00:00:00, 2010-03-30 00:00:00, 2010-03-31 00:00:00, 2010-04-01 00:00:00, 2010-04-02 00:00:00, 2010-04-03 00:00:00, 2010-04-04 00:00:00, 2010-04-05 00:00:00, 2010-04-06 00:00:00, 2010-04-07 00:00:00, 2010-04-08 00:00:00, 2010-04-09 00:00:00, 2010-04-10 00:00:00, ...] [2892 rows x 0 columns]
然後再進行向下填充操作:In[16]: df = pd.pivot_table(df, columns='name', index='date') In[17]: df Out[17]: house name A B C D date 2010-01-01 1.0 NaN NaN NaN 2010-06-09 NaN 1.0 NaN NaN 2011-04-05 NaN NaN NaN 3.0 2011-12-03 NaN NaN 2.0 NaN 2012-03-23 3.0 NaN NaN NaN In[18]: df = df.merge(time_range,how="right", left_index=True, right_index=True)
In[20]: df = df.fillna(method='ffill')
最後:
df = df.stack().reset_index()
結果太長,這裡就不貼上了。如果想向上填充,可選擇method = 'bfill‘