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 05 Python
Python生成随机密码的方法
Jun 16 Python
python的numpy模块安装不成功简单解决方法总结
Dec 23 Python
python版学生管理系统
Jan 10 Python
简单实现python画圆功能
Jan 25 Python
用TensorFlow实现戴明回归算法的示例
May 02 Python
opencv python 基于KNN的手写体识别的实例
Aug 03 Python
pycharm修改界面主题颜色的方法
Jan 17 Python
解决python3中的requests解析中文页面出现乱码问题
Apr 19 Python
python使用Qt界面以及逻辑实现方法
Jul 10 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
Aug 14 Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
May 25 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中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
PHP利用二叉堆实现TopK-算法的方法详解
2017/04/24 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
2018/05/11 PHP
jQuery实现购物车计算价格功能的方法
2015/03/25 Javascript
javascript获取文档坐标和视口坐标
2015/05/26 Javascript
详解基于javascript实现的苹果系统底部菜单
2016/12/02 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
微信小程序开发之选项卡(窗口底部TabBar)页面切换
2017/04/12 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
如何使用puppet替换文件中的string
2018/12/06 Javascript
JS实现数组深拷贝的方法分析
2019/03/06 Javascript
详解vue-video-player使用心得(兼容m3u8)
2019/08/23 Javascript
Element中Slider滑块的具体使用
2020/07/29 Javascript
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
Python中pip安装非PyPI官网第三方库的方法
2015/06/02 Python
python绘制简单折线图代码示例
2017/12/19 Python
django 按时间范围查询数据库实例代码
2018/02/11 Python
解决Python中list里的中文输出到html模板里的问题
2018/12/17 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
Python实现堡垒机模式下远程命令执行操作示例
2019/05/09 Python
TensorFlow实现简单的CNN的方法
2019/07/18 Python
Python 列表去重去除空字符的例子
2019/07/20 Python
python的range和linspace使用详解
2019/11/27 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
2020/02/29 Python
Python 实现一行输入多个数字(用空格隔开)
2020/04/29 Python
selenium如何定位span元素的实现
2021/01/13 Python
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
什么是Assembly(程序集)
2014/09/14 面试题
远程调用的原理
2014/07/05 面试题
大三学生英语考试作弊检讨书
2015/01/01 职场文书
采购员岗位职责
2015/02/03 职场文书
2015大学生入党个人自传
2015/06/26 职场文书
导游词之峨眉山
2019/12/16 职场文书
vue+element ui实现锚点定位
2021/06/29 Vue.js
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android