首先新建一个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