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中文件遍历的两种方法
Jun 16 Python
Python脚本实现网卡流量监控
Feb 14 Python
基于python 二维数组及画图的实例详解
Apr 03 Python
python+pandas分析nginx日志的实例
Apr 28 Python
python微信公众号之关键词自动回复
Jun 15 Python
Python面向对象之类的定义与继承用法示例
Jan 14 Python
Python中文编码知识点
Feb 18 Python
python实现树的深度优先遍历与广度优先遍历详解
Oct 26 Python
Python中的引用和拷贝实例解析
Nov 14 Python
浅谈pymysql查询语句中带有in时传递参数的问题
Jun 05 Python
python实现简单的井字棋
May 26 Python
Python实现的扫码工具居然这么好用!
Jun 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(3) php 函数
2010/02/15 PHP
浅谈PHP中单引号和双引号到底有啥区别呢?
2015/03/04 PHP
php从字符串创建函数的方法
2015/03/16 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
2017/02/24 PHP
js实现的切换面板实例代码
2013/06/17 Javascript
JavaScript动态加载样式表的方法
2015/03/21 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
跟我学习javascript的循环
2015/11/18 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
2016/09/17 Javascript
JS经典正则表达式笔试题汇总
2016/12/15 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
原生javascript移动端滑动banner效果
2017/03/10 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
2017/03/24 jQuery
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
bootstrap select插件封装成Vue2.0组件
2017/04/17 Javascript
Angular 表单控件示例代码
2017/06/26 Javascript
Angular客户端请求Rest服务跨域问题的解决方法
2017/09/19 Javascript
JS闭包经典实例详解
2018/12/20 Javascript
详解js创建对象的几种方法及继承
2019/04/12 Javascript
微信小程序日历弹窗选择器代码实例
2019/05/09 Javascript
javascript事件监听与事件委托实例详解
2019/08/16 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
2017/08/31 Python
使用Python通过win32 COM打开Excel并添加Sheet的方法
2018/05/02 Python
详解python实现交叉验证法与留出法
2019/07/11 Python
python 如何调用 dubbo 接口
2020/09/24 Python
电子商务专业在校生实习自我鉴定
2013/09/29 职场文书
中秋节国旗下演讲稿
2014/09/13 职场文书
小学五年级班主任工作经验交流材料
2015/11/02 职场文书
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang
微信小程序中使用vant框架的具体步骤
2022/02/18 Javascript
Python尝试实现蒙特卡罗模拟期权定价
2022/04/21 Python
Java 死锁解决方案
2022/05/11 Java/Android
git中cherry-pick命令的使用教程
2022/06/25 Servers