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表)
这个速度已经达到预期,基本感觉不到等待,优化完成。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
相关推荐
-
python 怎样将dataframe中的字符串日期转化为日期的方法
方法一:也是最简单的 直接使用pd.to_datetime函数实现 data['交易时间'] = pd.to_datetime(data['交易时间']) 方法二: 源自利用python进行数据分析P304 使用python的datetime包中的 strptime函数,datetime.strptime(value,'%Y/%M/%D') strftime函数,datetime.strftime('%Y/%M/%D') 注意使用datetime包中后面的字符串匹配需要和原字符串的格式相同,才能
-
python DataFrame转dict字典过程详解
这篇文章主要介绍了python DataFrame转dict字典过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 背景:将商品id以及商品类别作为字典的键值映射,生成字典,原为DataFrame # 创建一个DataFrame # 列值类型均为int型 import pandas as pd item = pd.DataFrame({'item_id': [100120, 10024504, 1055460], 'item_categor
-
python pandas.DataFrame.loc函数使用详解
官方函数 DataFrame.loc Access a group of rows and columns by label(s) or a boolean array. .loc[] is primarily label based, but may also be used with a boolean array. # 可以使用label值,但是也可以使用布尔值 Allowed inputs are: # 可以接受单个的label,多个label的列表,多个label的切片 A singl
-
使用Python向DataFrame中指定位置添加一列或多列的方法
对于这个问题,相信很多人都会很困惑,本篇文章将会给大家介绍一种非常简单的方式向DataFrame中任意指定的位置添加一列. 在此之前或许有不少读者已经了解了最普通的添加一列的方式,如下: import pandas as pd feature = pd.read_csv("C://Users//Machenike//Desktop//xzw//lr_train_data.txt", delimiter="\t", header=None, usecols=[0, 1
-
Python DataFrame一列拆成多列以及一行拆成多行
摘要 在进行数据分析时,我们经常需要把DataFrame的一列拆成多列或者根据某列把一行拆成多行,这篇文章主要讲解这两个目标的实现. 1.读取数据 2.将City列转成多列(以'|'为分隔符) 这里使用匿名函数lambda来讲City列拆成两列. 3.将DataFrame一行拆成多行(以'|'为分隔符) 方法一:在刚刚得到的DataFrame基础上操作,如下图所以,可以明显看到我们按照City列将DataFrame拆成了多行.主要是先将DataFrame拆成多列,然后拆成多个DataFrame再
-
Python如何在DataFrame增加数值
这篇文章主要介绍了Python如何在DataFrame增加数值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 生成一个 DataFrame import pandas as pd name = ['Cindy','John','Matt'] point = [78,87,88] df_grade = pd.DataFrame(name, columns=['name']) df_grade = pd.concat([df_grade, pd.D
-
python dataframe NaN处理方式
将dataframe中的NaN替换成希望的值 import pandas as pd df1 = pd.DataFrame([{'col1':'a', 'col2':1}, {'col1':'b', 'col2':2}]) df2 = pd.DataFrame([{'col1':'a', 'col3':11}, {'col1':'c', 'col3':33}]) data = pd.merge(left=df1, right=df2, how='left', left_on='col1', ri
-
Python pandas.DataFrame 找出有空值的行
0.摘要 pandas中DataFrame类型中,找出所有有空值的行,可以使用.isnull()方法和.any()方法. 1.找出含有空值的行 方法:DataFrame[DataFrame.isnull().T.any()] 其中,isnull()能够判断数据中元素是否为空值:T为转置:any()判断该行是否有空值. import pandas as pd import numpy as np n = np.arange(20, dtype=float).reshape(5,4) n[2,3]
-
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,igno
-
Python编程使用*解包和itertools.product()求笛卡尔积的方法
本文实例讲述了Python编程使用*解包和itertools.product()求笛卡尔积的方法.分享给大家供大家参考,具体如下: [问题] 目前有一字符串s = "['a', 'b'],['c', 'd']",想把它分开成为两个列表: list1 = ['a', 'b'] list2 = ['c', 'd'] 之后使用itertools.product()求笛卡尔积,应该写成: for i in itertools.product(list1, list2): print i 结果为
-
python实现两个dict合并与计算操作示例
本文实例讲述了python实现两个dict合并与计算操作.分享给大家供大家参考,具体如下: 用pythonic 的方法,将两个dict合并,并进行计算. 如果key值相同,则将他们的值进行想加,否则保留原来的值. 当然,通常会想到,用循环的方法来做,这是一般人都知道的做法,下面讲一个python dict 内置的方法来实现. 比如有如下两个字典: Dict A: {'a':1, 'b':2, 'c':3} Dict B: {'b':3, 'c':4, 'd':5} 将他们想加后得到的结果是:
-
Python基础教程之if判断,while循环,循环嵌套
if判断 判断的定义 如果条件满足,就做一件事:条件不满足,就做另一件事: 判断语句又被称为分支语句,有判断,才有分支: if判断语句基本语法 if语句格式: if 判断的条件: 条件成立后做的事 ... ... 代码缩进为一个tab键,或者四个空格,官方建议使用空格:但应注意,在python开发中,tab和空格不能混用! 判断年龄示例: # 判断是否成年,成年则可以进网吧 age = 19 if age>=18: print("你满了18岁,可以进网吧") i
-
Python实现两个list求交集,并集,差集的方法示例
本文实例讲述了Python实现两个list求交集,并集,差集的方法.分享给大家供大家参考,具体如下: 在python中,数组可以用list来表示.如果有两个数组,分别要求交集,并集与差集,怎么实现比较方便呢? 当然最容易想到的是对两个数组做循环,即写两个for循环来实现.这种写法大部分同学应该都会,而且也没有太多的技术含量,本博主就不解释了.这里给大家使用更为装bility的一些方法. 老规矩,talk is cheap,show me the code #!/usr/bin/env pytho
-
Python中pandas模块DataFrame创建方法示例
本文实例讲述了Python中pandas模块DataFrame创建方法.分享给大家供大家参考,具体如下: DataFrame创建 1. 通过列表创建DataFrame 2. 通过字典创建DataFrame 3. 通过Numpy数组创建DataFrame DataFrame这种列表式的数据结构和Excel工作表非常类似,其设计初衷是讲Series的使用场景由一维扩展到多维. DataFrame由按一定顺序的多列数据组成,各列的数据类型可以有所不同(数值.字符串.布尔值). Series对象的Ind
-
python判断两个序列的成员是否一样的实例代码
目的:判断两个序列的成员是否一样,如:list1 = [1, 2],list2 = [2, 1],则两个序列的成员是一样的. 实现:借助集合set()的性质实现. 代码如下: if __name__ == "__main__": l = [[2, 1], [3, 4]] for i in l: print (i) tmp = set(i) print (tmp) if tmp == {1, 2}: print ("yes") else: print ('no') 输
-
python 实现两个npy档案合并
我就废话不多说了,大家还是直接看代码吧~ old_record=numpy.load('exist.npy') temp_record=[] path = os.getcwd()+"\\database\\new" #获取当前路径 for root,dirs,files in os.walk(path): #遍历统计 for each in files: url=path+"\\"+each ... temp_record.append(temp) numpy.sa
-
使用python实现两数之和的画解算法
题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素在答案里不能重复出现. 你可以按任意顺序返回答案. 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] . 示例 2: 输入:nums = [3,2,4],
-
Python调用两个机器人聊天的实战
目录 机器人api接口 调用接口封装机器人 实现两个机器人聊天 聊天文字转语音 总结 众所周知,现在网上有很多非常智能bushi(智障)的AI机器人接口,利用这些接口,我们可以实现一个机器人,可以和它对话聊天,为了增加机器人聊天内容的趣味性,今天我决定要搞两个机器人,看它俩聊天,看看会不会发生什么有趣的事情,搞起!!! 机器人api接口 经过一通百度,找到几个推荐比较多的机器人接口,如下: 天行机器人: 天行机器人, 验证邮箱之后每天可以有100次的免费调用次数,测试用的话够了,不想用自己的邮箱
随机推荐
- php生成excel文件的简单方法
- 如何使用Go语言实现远程执行命令
- 使用Math.floor与Math.random取随机整数的方法详解
- HTML Dom与Css控制方法
- IIS日志清理(CMD版,VBS版,JS版,WSH版)
- python使用paramiko模块实现ssh远程登陆上传文件并执行
- 解读ASP.NET 5 & MVC6系列教程(16):自定义View视图文件查找逻辑
- Microsoft .Net Remoting系列教程之一:.Net Remoting基础篇
- bootstrap timepicker在angular中取值并转化为时间戳
- JavaScript函数节流和函数防抖之间的区别
- js实现拉幕效果的广告代码
- 有关JSON以及JSON在PHP中的应用
- Go语言按字节截取字符串的方法
- Android 类似微信登录输入框效果
- 快速学习jQuery插件 Form表单插件使用方法
- java 出现问题javax.servlet.http.HttpServlet was not found解决方法
- jQuery消息提示框插件Tipso
- Apache配置虚拟目录和多主机头的方法
- Android 判断是否能真正上网的实例详解
- Android字符串转Ascii码实例代码