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实现2014火车票查询代码分享
Jan 10 Python
python关键字and和or用法实例
May 28 Python
django接入新浪微博OAuth的方法
Jun 29 Python
21行Python代码实现拼写检查器
Jan 25 Python
举例讲解Python中字典的合并值相加与异或对比
Jun 04 Python
Python科学画图代码分享
Nov 29 Python
Python的numpy库中将矩阵转换为列表等函数的方法
Apr 04 Python
Django学习笔记之为Model添加Action
Apr 30 Python
python实现小球弹跳效果
May 10 Python
Python基于当前时间批量创建文件
May 07 Python
Python浮点型(float)运算结果不正确的解决方案
Sep 22 Python
详解Python描述符的工作原理
Jun 11 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 foreach循环中使用引用的问题
2013/11/06 PHP
YII Framework教程之异常处理详解
2016/03/14 PHP
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
2018/06/09 PHP
js wmp操作代码小结(音乐连播功能)
2008/11/08 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
分享一个常用的javascript静态类
2014/12/31 Javascript
AngularJS基础 ng-copy 指令实例代码
2016/08/01 Javascript
jQuery获取选中单选按钮radio的值
2016/12/27 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
vue服务端渲染添加缓存的方法
2018/09/18 Javascript
详解微信小程序用定时器实现倒计时效果
2019/04/30 Javascript
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
layui 弹出层回调获取弹出层数据的例子
2019/09/02 Javascript
微信小程序实现轨迹回放的示例代码
2019/12/13 Javascript
vuejs中父子组件之间通信方法实例详解
2020/01/17 Javascript
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
5个你不知道的JavaScript字符串处理库(小结)
2020/06/01 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
[01:44]《为梦想出发》—联想杯DOTA2完美世界全国高校联赛
2015/09/30 DOTA
python 实现登录网页的操作方法
2018/05/11 Python
Python使用ctypes调用C/C++的方法
2019/01/29 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
python全栈知识点总结
2019/07/01 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
2020/10/31 Python
python获取天气接口给指定微信好友发天气预报
2020/12/28 Python
CSS3制作酷炫的条纹背景
2017/11/09 HTML / CSS
基于HTML5 Canvas 实现商场监控实例详解
2017/11/20 HTML / CSS
.NET remoting中对象激活的两种方式
2015/06/08 面试题
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
2014年党员整改措施范文
2014/09/21 职场文书
2014年营业员工作总结
2014/11/18 职场文书
2015社区健康教育工作总结
2015/05/20 职场文书
PyTorch 如何检查模型梯度是否可导
2021/06/05 Python