pandas 使用merge实现百倍加速的操作_python

来源:脚本之家  责任编辑:小易  

对于非连续数据集,数据可视化时候需要每七天一个采样点。要求是选择此前最新的数据作为当日的数据展示,譬如今天是2019-06-18,而数据集里只有2019-06-15,那就用2019-06-15的数据作为2019-06-18的数据去描点。

每七天一个采样点,会使得每天展示所选的数据都会有所不同。当时间往后推移一天,日期为2019-06-19,那么最新数据点从2019-06-19开始,第二个就是2019-06-12。这里就需要一个算法来快速的根据当前日期去选出(填充)一系列数据供数据可视化之用。

一个非常直接的实现方法:

先生成一串目标时间序列,从某个开始日到今天为止,每七天一个日期。

把这些日期map到数据集的日期, Eg. {“2019-06-18”:“2019-06-15”…} 。

把map到的数据抽出来用pd.concat接起来。

代码如下:

target_dates = pd.date_range(end=now, periods=100, freq="7D")
full_dates = pd.date_range(start, now).tolist()
org_dates = df.date.tolist()

last_date = None
for d in full_dates:
 if d in org_dates:
  date_map[d] = d
  last_date = d
 elif last_date is not None:
  date_map[d] = last_date
 else:
  continue
new_df = pd.DataFrame()
for td in target_dates:
 new_df = pd.concat([new_df, df[df["date"]==date_map[td]]) 

这样的一个算法处理一个接近千万量级的数据集上大概需要十多分钟。仔细检查发现,每一次合并的dataframe数据量并不小,而且总的操作次数达到上万次。

所以就想如何避免高频次地使用pd.concat去合并dataframe。

最终想到了一个巧妙的方法,只需要修改一下前面的第三步,把日期的map转换成dataframe,然后和原始数据集做merge操作就可以了。

target_dates = pd.date_range(end=now, periods=100, freq="7D")
full_dates = pd.date_range(start, now).tolist()
org_dates = df.date.tolist()

last_date = None
for d in full_dates:
 if d in org_dates:
  date_map[d] = d
  last_date = d
 elif last_date is not None:
  date_map[d] = last_date
 else:
  continue
  
#### main change is from here #####
date_map_list = []
for td in target_dates:
 date_map_list.append({"target_date":td, "org_date":date_map[td]}) 
date_map_df = pd.DataFrame(date_map_list)
new_df = date_map_df.merge(df, left_on=["org_date"], right_on=["date"], how="inner") 

改进之后,所有的循环操作都在一个微数量级上,最后一个merge操作得到了所有有用的数据,运行时间在5秒左右,大大提升了性能。

补充:Pandas DataFrames 中 merge 合并的坑点(出现重复连接键)

在我的实际开发中遇到的坑点,查阅了相关文档 总结一下

left = pd.DataFrame({'A': [1, 2], 'B': [2, 2]})

right = pd.DataFrame({'A': [4, 5, 6], 'B': [2, 2, 2]})

result = pd.merge(left, right, on='B', how='outer')

警告:在重复键上加入/合并可能导致返回的帧是行维度的乘法,这可能导致内存溢出。在加入大型DataFrame之前,重复值。

检查重复键

如果知道右侧的重复项DataFrame但希望确保左侧DataFrame中没有重复项,则可以使用该 validate='one_to_many'参数,这不会引发异常。

pd.merge(left, right, on='B', how='outer', validate="one_to_many")
 
# 打印的结果:
 A_x B A_y
0 1 1 NaN
1 2 2 4.0
2 2 2 5.0
3 2 2 6.0

参数:

validate : str, optional
If specified, checks if merge is of specified type.

“one_to_one” or “1:1”: check if merge keys are unique in both left and right datasets.
“one_to_many” or “1:m”: check if merge keys are unique in left dataset.
“many_to_one” or “m:1”: check if merge keys are unique in right dataset.
“many_to_many” or “m:m”: allowed, but does not result in checks.

官方文档连接:

Pandas文档中提及 merge

以上为个人经验,希望能给大家一个参考,也希望大家多多支持真格学网。如有错误或未考虑完全的地方,望不吝赐教。

您可能感兴趣的文章:详解Python3 pandas.merge用法详解PANDAS 数据合并与重塑(join/merge篇)pandas dataframe的合并实现(append, merge, concat)在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例Pandas 合并多个Dataframe(merge,concat)的方法pandas merge报错的解决方案

  • 本文相关:
  • flask框架实现连接sqlite3数据库的方法分析
  • python抓取框架 scrapy的架构
  • python 元组的使用方法
  • pandas 按索引合并数据集的方法
  • python生成带有表格的图片实例
  • django中使用whoosh进行全文检索的方法
  • python利用pandas处理excel数据的应用详解
  • python编程的核心知识点总结
  • 利用anaconda作为python的依赖库管理方法
  • django 查询数据库并返回页面的例子
  • 请教Python中pandas的问题,pd.merge方法?
  • 怎么使用Python中Pandas库Resample,实现重采样,...
  • 哪里有python pandas.merge函数的详解,或者哪个大...
  • python pandas 怎么分块读取大量数据
  • python使用pandas处理绘图问题
  • python pandas 怎样高效地添加一行数据
  • python 的pandas.merge处理后,数据在哪
  • pandas merge函数很耗内存吗
  • 新手关于python中pandas函数的使用
  • 求助如何用pandas快速遍历DataFrame-Python论坛
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全vbsdos/bathtahtcpythonperl游戏相关vba远程脚本coldfusionruby专题autoitseraphzonepowershelllinux shellluagolangerlang其它首页详解python3 pandas.merge用法详解pandas 数据合并与重塑(join/merge篇)pandas dataframe的合并实现(append, merge, concat)在pandas中dataframe数据合并,连接(concat,merge,join)的实例pandas 合并多个dataframe(merge,concat)的方法pandas merge报错的解决方案flask框架实现连接sqlite3数据库的方法分析python抓取框架 scrapy的架构python 元组的使用方法pandas 按索引合并数据集的方法python生成带有表格的图片实例django中使用whoosh进行全文检索的方法python利用pandas处理excel数据的应用详解python编程的核心知识点总结利用anaconda作为python的依赖库管理方法django 查询数据库并返回页面的例子python入门教程 超详细1小时学会pycharm 2020最新永久激活码(附python 列表(list)操作方法详解python 元组(tuple)操作详解python 字典(dictionary)操作详解python strip()函数 介绍pycharm 使用心得(一)安装和首pycharm 2020年最新激活码(亲测python 中文乱码问题深入分析python中使用xlrd、xlwt操作excepython线程优先级队列知识点总结python带动态参数功能的sqlite工具类python为django项目上的每个应用程序创建python 列表推导和生成器表达式的使用python嵌入c/c++进行开发详解python wsgi的深入理解python实现读取及写入csv文件的方法示例python+mysql实现学生信息查询系统pytorch中tensor张量数据类型的转化方式python实现树莓派摄像头持续录像并传送到
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved