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代码(逐级优化)
May 25 Python
Python实现批量下载文件
May 17 Python
Python实现比较两个文件夹中代码变化的方法
Jul 10 Python
Python递归函数定义与用法示例
Jun 02 Python
Python中optparser库用法实例详解
Jan 26 Python
对Python3中的print函数以及与python2的对比分析
May 02 Python
用python处理图片实现图像中的像素访问
May 04 Python
python调用staf自动化框架的方法
Dec 26 Python
Python微医挂号网医生数据抓取
Jan 24 Python
Python 一键获取百度网盘提取码的方法
Aug 01 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
Feb 28 Python
使用python matplotlib 画图导入到word中如何保证分辨率
Apr 16 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 excel reader读取excel内容存入数据库实现代码
2012/12/06 PHP
javascript some()函数用法详解
2014/11/13 PHP
Yii中的cookie的发送和读取
2016/07/27 PHP
PHP日期和时间函数的使用示例详解
2020/08/06 PHP
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
javascript修改图片src的方法
2015/01/27 Javascript
JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
2016/06/16 Javascript
微信小程序 vidao实现视频播放和弹幕的功能
2016/11/02 Javascript
jQuery实现弹幕效果
2017/02/17 Javascript
原生JS中slice()方法和splice()区别
2017/03/06 Javascript
Javascript实现时间倒计时效果
2017/07/15 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
AngularJS 教程及实例代码
2017/10/23 Javascript
JavaScript 有用的代码片段和 trick
2018/02/22 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
2019/04/22 Javascript
解决layer弹出层msg的文字不显示的问题
2019/09/11 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
[01:34]DAC2018主赛事第四日五佳镜头 Gh巨牙海民助Miracle-死里逃生
2018/04/07 DOTA
Python实现把json格式转换成文本或sql文件
2015/07/10 Python
神经网络(BP)算法Python实现及应用
2018/04/16 Python
PyTorch线性回归和逻辑回归实战示例
2018/05/22 Python
利用Pandas读取文件路径或文件名称包含中文的csv文件方法
2018/07/04 Python
不知道这5种下划线的含义,你就不算真的会Python!
2018/10/09 Python
pyqt5 获取显示器的分辨率的方法
2019/06/18 Python
Python检查图片是否损坏及图片类型是否正确过程详解
2019/09/30 Python
pytorch AvgPool2d函数使用详解
2020/01/03 Python
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
给客户的道歉信
2014/01/13 职场文书
食品业务员岗位职责
2014/03/18 职场文书
淘宝好评语大全
2014/05/05 职场文书
2015年预防青少年违法犯罪工作总结
2015/05/22 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
Python上下文管理器Content Manager
2021/06/26 Python
logback 实现给变量指定默认值
2021/08/30 Java/Android
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL