Python通过两个dataframe用for循环求笛卡尔积
作者:何未生 发布时间:2023-11-02 04:32:24
标签:Python,dataframe,for,笛卡尔
合并两个没有共同列的dataframe,相当于按行号求笛卡尔积。
最终效果如下
以下代码是参考别人的代码修改的:
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秒
优化后的方法用时:0.1296539306640625秒(142行的表作为b表)
根据计算原理,将行数少的表放在b表可以更快,测试用时:0.021603107452392578秒(8行的表作为b表)
这个速度已经达到预期,基本感觉不到等待,优化完成。
来源:https://www.cnblogs.com/hewish/p/12785348.html


猜你喜欢
- 在同一个局域网的多台电脑,传递文件时可以通过 搭建web服务器,设置目录浏览的方式快速分享。如果上传就比较麻烦了,通过QQ/微信会产生很多文
- mysql.sock到底存储了什么东西?mysql.sock作为mysql的套接字一般用于本地连接数据库,在速度上优于TCP/IP连接。一般
- 很多文章都有提到关于使用phpExcel实现Excel数据的导入导出,大部分文章都差不多,或者就是转载的,都会出现一些问题,下面是本人研究p
- wxml文件中: <!--倒计时 --> <view class="countDownTimeVie
- 写下这篇博客,起源于Tornado邮件群组的这个问题how to use outer variable in inner method,这里
- 访问指定节点: getElementsByName(): <html> <head> <title>DO
- HTML在线编辑器相信大家见得多了,有些流行的在线编辑器具有很丰富的功能。但美中不足的是,现有的HTML在线编辑器设置字号大小通常只限于1-
- 1. fixture的声明我们使用@pytest.fixture()来声明fixture函数。fixture()即可无参数进行声明,也可以带
- Twig是一款快速、安全、灵活的PHP模板引擎,它内置了许多filter和tags,并且支持模板继承,能让你用最简洁的代码来描述你的模板。他
- 1、找到python的安装目录在python (版本号)\lib\idlelib目录下添加Clearwindow.py文件源代码如下:cla
- 现状≠将来?程序员做设计本身就很悲哀,纠结于客户与坚持之间就更是如此。无论我今后的路会怎么走,我想始终不变的事情就是与客户博弈了。无论是放弃
- 本文介绍了三种跨域访问的方法,php,asp及jsp种访问远程文件的方法。这几天脑细胞剩下的不多了,不过问题都一个个解决了。我希望搜索引擎能
- 前言本文介绍如何使用Python制作一个简单的猜数字游戏。游戏规则玩家将猜测一个数字。如果猜测是正确的,玩家赢。如果不正确,程序会提示玩家所
- 最近在使用Testlink时,发现导入的用例是xml格式,且没有合适的工具转成excel格式,xml使用excel打开显示的东西也太多,网上
- 1.selenum:三方库。可以实现让浏览器完成自动化的操作。2.环境搭建2.1 安装:pip install selenium2.2 获取
- 01、函数参数和返回值的作用函数根据 有没有参数 以及 有没有返回值,可以相互结合,共有四种:无参数 无返回值无参数 有返回值有参数 无返回
- parse_dates : boolean or list of ints or names or list of lists or dic
- 如果点击“保存文本文件”将会弹出保存文本文件的对话框口,保存的文本文件中的内容是如下:/* 2010年4月5日0
- admin组件使用Django 提供了基于 web 的管理工具。Django 自动管理工具是 django.contrib 的一部分。你可以
- 本文介绍了Vue.js 常用模板语法,分享给大家,具体如下:一、文本渲染Vue支持动态渲染文本,即在修改属性的同时,实时渲染文本内容。同时为