首先新建一个dataframe:
1
2
3
4
5
6
7
8
9
|
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列改为时间类型:
1
|
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
1
2
3
4
5
6
7
8
9
|
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] |
然后用上上篇博客中提到的pivot_table将原本的df转变之后,与time_range进行merger操作。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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 ) |
然后再进行向下填充操作:
1
|
In[ 20 ]: df = df.fillna(method = 'ffill' ) |
最后:
1
|
df = df.stack().reset_index() |
结果太长,这里就不粘贴了。如果想向上填充,可选择method = 'bfill‘
以上这篇python dataframe向下向上填充,fillna和ffill的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/chenKFKevin/article/details/78688786