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求crc32值的方法
Oct 05 Python
python+django加载静态网页模板解析
Dec 12 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
Apr 28 Python
pandas.DataFrame选取/排除特定行的方法
Jul 03 Python
Sanic框架Cookies操作示例
Jul 17 Python
详解python3 + Scrapy爬虫学习之创建项目
Apr 12 Python
pytorch 实现打印模型的参数值
Dec 30 Python
Python 实现一行输入多个数字(用空格隔开)
Apr 29 Python
python和JavaScript哪个容易上手
Jun 23 Python
keras K.function获取某层的输出操作
Jun 29 Python
深度学习详解之初试机器学习
Apr 14 Python
OpenCV图像变换之傅里叶变换的一些应用
Jul 26 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 self,$this,const,static,->的使用
2009/10/22 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
详解PHP实现执行定时任务
2015/12/21 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
非常不错的功能强大代码简单的管理菜单美化版
2008/07/09 Javascript
Javascript 中的类和闭包
2010/01/08 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
JQuery循环滚动图片代码
2011/12/08 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
利用angular.copy取消变量的双向绑定与解析
2016/11/25 Javascript
ES6学习教程之模板字符串详解
2017/10/09 Javascript
nodejs基础之多进程实例详解
2018/12/27 NodeJs
React路由鉴权的实现方法
2019/09/05 Javascript
通过实例解析vuejs如何实现调试代码
2020/07/16 Javascript
JS可断点续传文件上传实现代码解析
2020/07/30 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
Python脚本实现格式化css文件
2015/04/08 Python
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
在Mac中配置Python虚拟环境过程解析
2020/06/22 Python
使用Python实现音频双通道分离
2020/12/25 Python
python实现无边框进度条的实例代码
2020/12/30 Python
详解Python中的Lock和Rlock
2021/01/26 Python
海量信息软件测试笔试题
2015/08/08 面试题
我的五年职业生涯规划
2014/01/23 职场文书
村官工作鉴定评语
2014/01/27 职场文书
工程招投标邀请书
2014/01/30 职场文书
初中毕业生的自我评价
2014/03/03 职场文书
环保标语大全
2014/06/12 职场文书
节电标语大全
2014/06/23 职场文书
煤矿开采专业求职信
2014/07/08 职场文书
出租车拒载检讨书
2015/01/28 职场文书
学校计划生育责任书
2015/05/09 职场文书
虎兄虎弟观后感
2015/06/12 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书
golang中的空slice案例
2021/04/27 Golang