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实现给字典添加条目的方法
Sep 25 Python
Python文档生成工具pydoc使用介绍
Jun 02 Python
Anaconda入门使用总结
Apr 05 Python
Python二进制串转换为通用字符串的方法
Jul 23 Python
python模块导入的细节详解
Dec 10 Python
解决Django migrate不能发现app.models的表问题
Aug 31 Python
TensorFlow实现打印每一层的输出
Jan 21 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
Aug 07 Python
python各种excel写入方式的速度对比
Nov 10 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
Dec 04 Python
Python wordcloud库安装方法总结
Dec 31 Python
基于Python的EasyGUI学习实践
May 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
DOTA2 玩家自创拉野攻略 特色英雄快速成长篇
2020/04/20 DOTA
用PHP和ACCESS写聊天室(一)
2006/10/09 PHP
优化PHP代码的53条建议
2008/03/27 PHP
smarty实现多级分类的方法
2014/12/05 PHP
PHP中实现crontab代码分享
2015/03/26 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
实用javaScript技术-屏蔽类
2006/08/15 Javascript
jquery+ashx无刷新GridView数据显示插件(实现分页、排序、过滤功能)
2010/04/25 Javascript
JSQL 批量图片切换的实现代码
2010/05/05 Javascript
jquery蒙版控件实现代码
2010/12/08 Javascript
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
jquery插件开发之实现md5插件
2014/03/17 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
JavaScript返回上一页的三种方法及区别介绍
2015/07/04 Javascript
javascript之Boolean类型对象
2016/06/07 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
2016/09/05 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
Vue+Element-U实现分页显示效果
2020/11/15 Javascript
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
python 图片验证码代码
2008/12/07 Python
python 线程的暂停, 恢复, 退出详解及实例
2016/12/06 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
Chi Chi London官网:购买连衣裙和礼服
2020/10/25 全球购物
医学生实习自我鉴定
2013/09/27 职场文书
护士毕业生自我鉴定
2014/02/08 职场文书
表扬通报怎么写
2015/01/16 职场文书
2015年小学体育教师工作总结
2015/10/23 职场文书
管理者日常工作必备:22条企业管理流程模板!
2019/07/12 职场文书
研究生毕业登记表的自我鉴定范文
2019/07/15 职场文书
创业计划书之牛肉汤快餐店
2019/10/08 职场文书
Django中session进行权限管理的使用
2021/07/09 Python
python之json文件转xml文件案例讲解
2021/08/07 Python