python dataframe向下向上填充,fillna和ffill的方法


Posted in Python onNovember 28, 2018

首先新建一个dataframe:

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

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操作。

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‘

以上这篇python dataframe向下向上填充,fillna和ffill的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
wxPython中文教程入门实例
Jun 09 Python
浅析Python的Django框架中的Memcached
Jul 23 Python
深入理解Python中字典的键的使用
Aug 19 Python
Python socket网络编程TCP/IP服务器与客户端通信
Jan 05 Python
如何优雅地处理Django中的favicon.ico图标详解
Jul 05 Python
用python建立两个Y轴的XY曲线图方法
Jul 08 Python
python Elasticsearch索引建立和数据的上传详解
Aug 04 Python
Python 切分数组实例解析
Nov 07 Python
python读取Kafka实例
Dec 23 Python
在Pytorch中计算自己模型的FLOPs方式
Dec 30 Python
Python中join()函数多种操作代码实例
Jan 13 Python
基于python实现判断字符串是否数字算法
Jul 10 Python
在python中只选取列表中某一纵列的方法
Nov 28 #Python
手把手教你如何安装Pycharm(详细图文教程)
Nov 28 #Python
python 使用re.search()筛选后 选取部分结果的方法
Nov 28 #Python
Python读取excel指定列生成指定sql脚本的方法
Nov 28 #Python
Python从Excel中读取日期一列的方法
Nov 28 #Python
pandas使用apply多列生成一列数据的实例
Nov 28 #Python
pandas通过loc生成新的列方法
Nov 28 #Python
You might like
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
2014/11/04 PHP
php正则表达式学习笔记
2015/11/13 PHP
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
js解决弹窗问题实现班级跳转DIV示例
2014/01/06 Javascript
JS实现div居中示例
2014/04/17 Javascript
JavaScript实现防止网页被嵌入Frame框架的代码分享
2014/12/29 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
2016/05/09 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
webpack实用小功能介绍
2018/01/02 Javascript
3种vue路由传参的基本模式
2018/02/22 Javascript
vue中关闭eslint的方法分析
2018/08/04 Javascript
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
Node使用koa2实现一个简单JWT鉴权的方法
2021/01/26 Javascript
js 执行上下文和作用域的相关总结
2021/02/08 Javascript
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
通过实例解析Python调用json模块
2019/12/11 Python
学会迭代器设计模式,帮你大幅提升python性能
2021/01/03 Python
利用CSS3的flexbox实现水平垂直居中与三列等高布局
2016/09/12 HTML / CSS
THE OUTNET英国官网:国际设计师品牌折扣网站
2016/08/14 全球购物
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
RIP版本1跟版本2的区别
2013/12/30 面试题
小学捐书活动总结
2014/07/05 职场文书
校外活动方案
2014/08/28 职场文书
年底个人总结范文
2015/03/10 职场文书
会计专业求职信范文
2015/03/19 职场文书
经费申请报告
2015/05/15 职场文书
为自己工作观后感
2015/06/11 职场文书
mysql 直接拷贝data 目录下文件还原数据的实现
2021/07/25 MySQL
python计算列表元素与乘积详情
2022/08/05 Python