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 14 Python
Python中字典(dict)合并的四种方法总结
Aug 10 Python
Python subprocess模块功能与常见用法实例详解
Jun 28 Python
pip安装py_zipkin时提示的SSL问题对应
Dec 29 Python
在python里协程使用同步锁Lock的实例
Feb 19 Python
Django自定义用户登录认证示例代码
Jun 30 Python
Python企业编码生成系统之主程序模块设计详解
Jul 26 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
Dec 18 Python
Django 多对多字段的更新和插入数据实例
Mar 31 Python
使用Keras训练好的.h5模型来测试一个实例
Jul 06 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 Python
python 实现mysql自动增删分区的方法
Apr 01 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 excel reader读取excel内容存入数据库实现代码
2012/12/06 PHP
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
2013/06/05 PHP
zend framework文件上传功能实例代码
2013/12/25 PHP
zf框架的session会话周期及次数限制使用示例
2014/03/13 PHP
php计算当前程序执行时间示例
2014/04/24 PHP
php生成固定长度纯数字编码的方法
2015/07/09 PHP
PHP+MySQL实现无极限分类栏目的方法
2015/12/23 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
php实现xml与json之间的相互转换功能实例
2016/07/07 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
2017/05/02 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
JavaScript 申明函数的三种方法 每个函数就是一个对象(一)
2009/12/04 Javascript
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
2010/11/11 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
js原生之焦点图转换加定时器实例
2016/12/12 Javascript
纯js的右下角弹窗实例
2017/03/12 Javascript
对angular 实时更新模板视图的方法$apply详解
2018/10/09 Javascript
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
Python将xml和xsl转换为html的方法
2015/03/10 Python
深入解析Python中的线程同步方法
2016/06/14 Python
python虚拟环境virtualenv的安装与使用
2017/09/21 Python
PyQt5实现拖放功能
2018/04/25 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
Python 加密与解密小结
2018/12/06 Python
在Python中,不用while和for循环遍历列表的实例
2019/02/20 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
django 解决扩展自带User表遇到的问题
2020/05/14 Python
全面介绍python中很常用的单元测试框架unitest
2020/12/14 Python
css3打造一款漂亮的卡哇伊按钮
2013/03/20 HTML / CSS
全球摩托车装备领导者:RevZilla
2017/09/04 全球购物
2015年毕业生自荐信范文
2015/03/24 职场文书
校运会班级霸气口号
2015/12/24 职场文书
廉洁自律承诺书2016
2016/03/25 职场文书
golang生成vcf通讯录格式文件详情
2022/03/25 Golang
python blinker 信号库
2022/05/04 Python