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用来获得图片exif信息的库实例分析
Mar 16 Python
python实现查找excel里某一列重复数据并且剔除后打印的方法
May 26 Python
python中使用正则表达式的连接符示例代码
Oct 10 Python
mac下给python3安装requests库和scrapy库的实例
Jun 13 Python
django中ORM模型常用的字段的使用方法
Mar 05 Python
75条笑死人的知乎神回复,用60行代码就爬完了
May 06 Python
Django框架设置cookies与获取cookies操作详解
May 27 Python
Django实现发送邮件功能
Jul 18 Python
Python自动化导出zabbix数据并发邮件脚本
Aug 16 Python
python装饰器练习题及答案
Nov 01 Python
Django contrib auth authenticate函数源码解析
Nov 12 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
Jan 08 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实现mysql同步的实现方法
2009/10/21 PHP
php中的filesystem文件系统函数介绍及使用示例
2014/02/13 PHP
PHP创建桌面快捷方式的实例代码
2014/02/17 PHP
PHP图片等比例缩放生成缩略图函数分享
2014/06/10 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
2016/11/16 PHP
JQuery 学习笔记 选择器之二
2009/07/23 Javascript
FF IE兼容性的修改小结
2009/09/02 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
2014/05/04 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
JavaScript程序设计之JS调试
2015/12/09 Javascript
BootStrap中按钮点击后被禁用按钮的最佳实现方法
2016/09/23 Javascript
javascript 网页进度条简单实例
2017/02/22 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
2018/12/10 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
[45:16]完美世界DOTA2联赛循环赛 IO vs FTD BO2第二场 11.05
2020/11/06 DOTA
python文件操作之目录遍历实例分析
2015/05/20 Python
使用Python对SQLite数据库操作
2017/04/06 Python
在Python中实现替换字符串中的子串的示例
2018/10/31 Python
Python 动态导入对象,importlib.import_module()的使用方法
2019/08/28 Python
python 统计文件中的字符串数目示例
2019/12/24 Python
python中有关时间日期格式转换问题
2019/12/25 Python
PyCharm GUI界面开发和exe文件生成的实现
2020/03/04 Python
Sixt美国租车:高端豪华车型自驾体验
2017/09/02 全球购物
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
外语学院毕业生的自我鉴定
2013/11/28 职场文书
内业资料员岗位职责
2014/01/04 职场文书
合作经营协议书范本
2014/09/16 职场文书
2015年信贷员工作总结
2015/04/28 职场文书
酒会开场白大全
2015/06/01 职场文书
实施意见格式范本
2015/06/05 职场文书
Python实现简单的俄罗斯方块游戏
2021/09/25 Python
SQL语法CONSTRAINT约束操作详情
2022/01/18 MySQL