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表)

这个速度已经达到预期,基本感觉不到等待,优化完成。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 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 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转dict字典过程详解

    这篇文章主要介绍了python DataFrame转dict字典过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 背景:将商品id以及商品类别作为字典的键值映射,生成字典,原为DataFrame # 创建一个DataFrame # 列值类型均为int型 import pandas as pd item = pd.DataFrame({'item_id': [100120, 10024504, 1055460], 'item_categor

  • Python DataFrame一列拆成多列以及一行拆成多行

    摘要 在进行数据分析时,我们经常需要把DataFrame的一列拆成多列或者根据某列把一行拆成多行,这篇文章主要讲解这两个目标的实现. 1.读取数据 2.将City列转成多列(以'|'为分隔符) 这里使用匿名函数lambda来讲City列拆成两列. 3.将DataFrame一行拆成多行(以'|'为分隔符) 方法一:在刚刚得到的DataFrame基础上操作,如下图所以,可以明显看到我们按照City列将DataFrame拆成了多行.主要是先将DataFrame拆成多列,然后拆成多个DataFrame再

  • 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中指定位置添加一列或多列的方法

    对于这个问题,相信很多人都会很困惑,本篇文章将会给大家介绍一种非常简单的方式向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 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如何在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用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次的免费调用次数,测试用的话够了,不想用自己的邮箱

随机推荐