Python通过两个dataframe用for循环求笛卡尔积


Posted in Python onApril 29, 2020

合并两个没有共同列的dataframe,相当于按行号求笛卡尔积。

最终效果如下

Python通过两个dataframe用for循环求笛卡尔积

以下代码是参考别人的代码修改的:

def cartesian_df(A,B):
    new_df = pd.DataFrame(columns=list(A).extend(list(B)))
    for _,A_row in A.iterrows():
      for _,B_row in B.iterrows():
        row = A_row.append(B_row)
        new_df = new_df.append(row,ignore_index=True)
    return new_df
#这个方法,如果两张表列名重复会出错

这段代码的思路是对两个表的每一行进行循环,运行速度比较慢,复杂度应该是O(m*n),m是A表的行数,n是B表的行数。

因为我用到的合并表行数比较多,时间太慢,所以针对上面的代码进行了优化。

思路是利用dataframe的merge功能,先循环复制A表,将循环次数添加为列,直接使用merge合并,复杂度应该为O(n)(n是B表的行数),代码如下:

def cartesian_df(df_a,df_b):
  '求两个dataframe的笛卡尔积'
  #df_a 复制n次,索引用复制次数
  new_df_a = pd.DataFrame(columns=list(df_a))
  for i in range(0,df_b.shape[0]):
    df_a['merge_index'] = i
    new_df_a = new_df_a.append(df_a,ignore_index=True)
  #df_b 设置索引为行数
  df_b.reset_index(inplace = True, drop =True)
  df_b['merge_index'] = df_b.index
  #merge
  new_df = pd.merge(new_df_a,df_b,on=['merge_index'],how='left').drop(['merge_index'],axis = 1)
  return new_df

#两个原始表中不能有列名'merge_index'

使用一张8行的表和一张142行的表进行测试,优化前的方法用时:5.560689926147461秒

Python通过两个dataframe用for循环求笛卡尔积

优化后的方法用时:0.1296539306640625秒(142行的表作为b表)

Python通过两个dataframe用for循环求笛卡尔积

根据计算原理,将行数少的表放在b表可以更快,测试用时:0.021603107452392578秒(8行的表作为b表)

Python通过两个dataframe用for循环求笛卡尔积

这个速度已经达到预期,基本感觉不到等待,优化完成。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python的Supervisor进行进程监控以及自动启动
May 29 Python
python基础教程之循环介绍
Aug 29 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
Dec 31 Python
深入解析Python中的__builtins__内建对象
Jun 21 Python
Python使用openpyxl读写excel文件的方法
Jun 30 Python
python matplotlib 在指定的两个点之间连线方法
May 25 Python
vue.js实现输入框输入值内容实时响应变化示例
Jul 07 Python
Python面向对象之类和实例用法分析
Jun 08 Python
关于Python形参打包与解包小技巧分享
Aug 24 Python
Python识别html主要文本框过程解析
Feb 18 Python
Python合并多张图片成PDF
Jun 09 Python
python scrapy简单模拟登录的代码分析
Jul 21 Python
Django分组聚合查询实例分享
Apr 29 #Python
python中sympy库求常微分方程的用法
Apr 28 #Python
tensorflow2.0的函数签名与图结构(推荐)
Apr 28 #Python
Python startswith()和endswith() 方法原理解析
Apr 28 #Python
Python如何将函数值赋给变量
Apr 28 #Python
Python多线程thread及模块使用实例
Apr 28 #Python
Python基于模块Paramiko实现SSHv2协议
Apr 28 #Python
You might like
php之XML转数组函数的详解
2013/06/07 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
laravel 5.1下php artisan migrate的使用注意事项总结
2017/06/07 PHP
一个网马的tips实现分析
2010/11/28 Javascript
jQuery的.live()和.die() 使用介绍
2011/09/10 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
2013/05/28 Javascript
jQuery-1.9.1源码分析系列(十一)DOM操作续之克隆节点
2015/12/01 Javascript
详解vue axios二次封装
2018/07/22 Javascript
微信小程序获取音频时长与实时获取播放进度问题
2018/08/28 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
2020/05/19 jQuery
聊聊vue 中的v-on参数问题
2021/01/29 Vue.js
基于scrapy实现的简单蜘蛛采集程序
2015/04/17 Python
详解Python中的相对导入和绝对导入
2017/01/06 Python
Python实现复杂对象转JSON的方法示例
2017/06/22 Python
浅谈python爬虫使用Selenium模拟浏览器行为
2018/02/23 Python
JavaScript实现一维数组转化为二维数组
2018/04/17 Python
Django项目实战之用户头像上传与访问的示例
2018/04/21 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
2018/08/03 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
对pandas处理json数据的方法详解
2019/02/08 Python
Python 使用type来定义类的实现
2019/11/19 Python
使用Python获取当前工作目录和执行命令的位置
2020/03/09 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
安德玛菲律宾官网:Under Armour菲律宾
2020/07/28 全球购物
动物科学专业毕业生的自我评价
2013/11/29 职场文书
校长寄语大全
2014/04/09 职场文书
工程负责人任命书
2014/06/06 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
2014年村支部书记四风对照检查材料思想汇报
2014/10/02 职场文书
感谢信的技巧及范例
2019/05/15 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
解读Vue组件注册方式
2021/05/15 Vue.js
springboot中rabbitmq实现消息可靠性机制详解
2021/09/25 Java/Android
我去timi了,一起去timi是什么意思?
2022/04/13 杂记