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 相关文章推荐
用Python实现一个简单的线程池
Apr 07 Python
python中的代码编码格式转换问题
Jun 10 Python
Python基础练习之用户登录实现代码分享
Nov 08 Python
详解python如何在django中为用户模型添加自定义权限
Oct 15 Python
python实现微信定时每天和女友发送消息
Apr 29 Python
python实现Dijkstra算法的最短路径问题
Jun 21 Python
Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析
Sep 20 Python
python ffmpeg任意提取视频帧的方法
Feb 21 Python
使用python自动追踪你的快递(物流推送邮箱)
Mar 17 Python
Python Http请求json解析库用法解析
Nov 28 Python
python中xlutils库用法浅析
Dec 29 Python
Python使用psutil库对系统数据进行采集监控的方法
Aug 23 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
Win2003服务器安全加固设置--进一步提高服务器安全性
2007/05/23 PHP
PHP添加MySQL数据记录代码
2008/06/07 PHP
深入php-fpm的两种进程管理模式详解
2013/06/03 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
2017/08/03 PHP
JavaScript 原型学习总结
2010/10/29 Javascript
javascript字符串替换及字符串分割示例代码
2013/12/12 Javascript
浅析javascript中函数声明和函数表达式的区别
2015/02/15 Javascript
JQuery实现动态添加删除评论的方法
2015/05/18 Javascript
Jquery1.9.1源码分析系列(六)延时对象应用之jQuery.ready
2015/11/24 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
JS实现4位随机验证码
2020/10/19 Javascript
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
用Python进行基础的函数式编程的教程
2015/03/31 Python
详解Python验证码识别
2016/01/25 Python
python 创建一个空dataframe 然后添加行数据的实例
2018/06/07 Python
Python Socket编程之多线程聊天室
2018/07/28 Python
在django view中给form传入参数的例子
2019/07/19 Python
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
Python chardet库识别编码原理解析
2020/02/18 Python
没编程基础可以学python吗
2020/06/17 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
2021/01/05 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
2012/11/09 面试题
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
公司业务主管岗位职责
2013/12/07 职场文书
毕业大学生自荐信
2014/06/17 职场文书
电气工程及其自动化专业求职信
2014/06/23 职场文书
八达岭长城导游词
2015/01/30 职场文书
销售内勤岗位职责范本
2015/04/13 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
2019年亲子运动会口号
2019/10/11 职场文书
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS