Python如何通过两个dataframe用的循环求笛卡尔积

  介绍

这篇文章主要为大家展示了Python如何通过两个dataframe用的循环求笛卡尔积,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。

合并两个没有共同列的dataframe,相当于按行号求笛卡尔积。

最终效果如下

 Python如何通过两个dataframe用的循环求笛卡尔积

以下代码是参考别人的代码修改的:

 def cartesian_df (A, B):
  new_df=pd.DataFrame(列=(A) .extend列表(列表(B)))
  _,A_row A.iterrows ():
  _,B_row B.iterrows ():
  行=A_row.append (B_row)
  new_df=new_df.append(行,ignore_index=True)
  返回new_df
  #这个方法,如果两张表列名重复会出错

这段代码的思路是对两个表的每一行进行循环,运行速度比较慢,复杂度应该是O (m * n), m是一个表的行数,n是B表的行数。

因为我用到的合并表行数比较多,时间太慢,所以针对上面的代码进行了优化。

思路是利用dataframe合并的功能,先循环复制一个表,将循环次数添加为列,直接使用合并合,并复杂度应该为O (n) (n是B表的行数),代码如下:

 def cartesian_df (df_a df_b):
  & # 39;求两个dataframe的笛卡尔积& # 39;
  # df_a复制n次,索引用复制次数
  new_df_a=pd.DataFrame(列=列表(df_a))
  因为我在范围(0,df_b.shape [0]):
  df_a [& # 39; merge_index& # 39;]=我
  new_df_a=new_df_a.append (df_a ignore_index=True)
  # df_b设置索引为行数
  df_b。reset_index(原地=True,放弃=True)
  df_b [& # 39; merge_index& # 39;]=df_b.index
  #合并
  new_df=pd.merge (new_df_a, df_b=[& # 39; merge_index& # 39;],如何=& # 39;左# 39;).drop ((& # 39; merge_index& # 39;],轴=1)
  返回new_df
  
  #两个原始表中不能有列名& # 39;merge_index& # 39; 

使用一行8张的表和一行142张的表进行测试,优化前的方法用时:5.560689926147461秒

 Python如何通过两个dataframe用的循环求笛卡尔积

优化后的方法用时:0.1296539306640625秒(142行的表作为b表)

 Python如何通过两个dataframe用的循环求笛卡尔积

根据计算原理,将行数少的表放在b表可以更快,测试用时:0.021603107452392578秒(8行的表作为b表)

 Python如何通过两个dataframe用的循环求笛卡尔积

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

以上就是关于Python如何通过两个dataframe用的循环求笛卡尔积的内容,如果你们有学习到知识或者技能,可以把它分享出去让更多的人看的到。

Python如何通过两个dataframe用的循环求笛卡尔积