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自动化测试ConfigParser模块读写配置文件
Aug 15 Python
python脚本替换指定行实现步骤
Jul 11 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
May 24 Python
对pyqt5中QTabWidget的相关操作详解
Jun 21 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
使用Python求解带约束的最优化问题详解
Feb 11 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
Apr 24 Python
Python常驻任务实现接收外界参数代码解析
Jul 21 Python
Python环境配置实现pip加速过程解析
Nov 27 Python
基于Django快速集成Echarts代码示例
Dec 01 Python
Jmeter调用Python脚本实现参数互相传递的实现
Jan 22 Python
Python可视化神器pyecharts绘制地理图表
Jul 07 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使浏览器直接下载pdf文件的方法
2013/11/15 PHP
php数据库备份还原类分享
2014/03/20 PHP
PHP中的Memcache详解
2014/04/05 PHP
ThinkPHP连接数据库及主从数据库的设置教程
2014/08/22 PHP
PHP中Session可能会引起并发问题
2015/06/26 PHP
javascript处理table表格的代码
2010/12/06 Javascript
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
js获取域名的方法
2015/01/27 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
2016/07/15 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
2016/08/31 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
Angular.js初始化之ng-app的自动绑定与手动绑定详解
2017/07/31 Javascript
Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法
2017/08/22 Javascript
taro开发微信小程序的实践
2019/05/21 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
ubuntu中配置pyqt4环境教程
2017/12/27 Python
python指定写入文件时的编码格式方法
2018/06/07 Python
Python读取文件内容为字符串的方法(多种方法详解)
2020/03/04 Python
pytorch学习教程之自定义数据集
2020/11/10 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
2020/06/01 HTML / CSS
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
Tuckernuck官网:经典的美国品质服装、鞋子和配饰
2021/01/11 全球购物
单位在职证明范本
2014/01/09 职场文书
《蒲公英》教学反思
2014/02/28 职场文书
文明寄语大全
2014/04/11 职场文书
敬老院院长事迹材料
2014/05/21 职场文书
材料成型及控制工程专业求职信
2014/06/19 职场文书
艺术设计专业毕业生推荐信
2014/07/08 职场文书
党员检讨书
2014/10/13 职场文书
个人年终总结范文
2015/03/09 职场文书
汉字听写大会观后感
2015/06/12 职场文书
js实现模拟购物商城案例
2021/05/18 Javascript
java设计模式--三种工厂模式详解
2021/07/21 Java/Android
世界十大狙击步枪排行榜
2022/03/20 杂记