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中使用摄像头实现简单的延时摄影技术
Mar 27 Python
mac系统安装Python3初体验
Jan 02 Python
django celery redis使用具体实践
Apr 08 Python
深入学习python多线程与GIL
Aug 26 Python
python实现简单银行管理系统
Oct 25 Python
Python函数的默认参数设计示例详解
Dec 01 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
Feb 24 Python
Python连接Mysql进行增删改查的示例代码
Aug 03 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
Sep 03 Python
python 实时调取摄像头的示例代码
Nov 25 Python
Django多个app urls配置代码实例
Nov 26 Python
python爬虫中采集中遇到的问题整理
Nov 27 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中多维数组的foreach遍历示例
2014/06/13 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
2015/09/25 PHP
yii用户注册表单验证实例
2015/12/26 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
PHP格式化显示时间date()函数代码
2018/10/03 PHP
jQuery学习2 选择器的使用说明
2010/02/07 Javascript
JavaScript Eval 函数使用
2010/03/23 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
2016/01/22 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
jQuery实现布局高宽自适应的简单实例
2016/05/28 Javascript
JS获取html元素的标记名实现方法
2016/10/08 Javascript
AngularJS全局scope与Isolate scope通信用法示例
2016/11/22 Javascript
bootstrap日期插件daterangepicker使用详解
2017/10/19 Javascript
微信小程序如何获取用户信息
2018/01/26 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
vue页面切换项目实现转场动画的方法
2019/11/12 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
Python实现从url中提取域名的几种方法
2014/09/26 Python
Python实现把json格式转换成文本或sql文件
2015/07/10 Python
Python实现简易Web爬虫详解
2018/01/03 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
2018/03/15 Python
Python应用库大全总结
2018/05/30 Python
python GUI实现小球满屏乱跑效果
2019/05/09 Python
Pycharm修改python路径过程图解
2020/05/22 Python
什么是python的函数体
2020/06/19 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
Python3合并两个有序数组代码实例
2020/08/11 Python
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
工商学院毕业生自荐信
2013/11/12 职场文书
客户经理竞聘演讲稿
2014/05/15 职场文书
2014最新党员违纪检讨书
2014/10/12 职场文书
师德师风整改措施
2014/10/24 职场文书
会计专业求职信范文
2015/03/19 职场文书
2015年度护士个人工作总结
2015/04/09 职场文书
2015年普法依法治理工作总结
2015/05/26 职场文书
详解解Django 多对多表关系的三种创建方式
2021/08/23 Python