当前位置: 首页 > 知识库问答 >
问题:

连接2个pysaprk数据框并从连接中删除重复行

公孙辰龙
2023-03-14

我试图通过2列连接2个pyspark数据帧,数据帧是:

df1 = pd.DataFrame()
df1["ID"] = ["1","1","2","5"]
df1["A"] = ["100","100","300","450"]
df1["Date"] = [2015,2019,2002,2003]
df1["Date2"] = [2000,2000,2000,2000]
df1 = sqlContext.createDataFrame(df1)

df2 = pd.DataFrame()
df2["ID"] = ["1","1","5","9"]
df2["A"] = ["100","100","450","250"]
df2["Z"] = [65,65,65,65]
df2 = sqlContext.createDataFrame(df2)

DF1:

+---+---+----+-----+
| ID|  A|Date|Date2|
+---+---+----+-----+
|  1|100|2015| 2000|
|  1|100|2019| 2000|
|  2|300|2002| 2000|
|  5|450|2003| 2000|
+---+---+----+-----+

df2:

+---+---+---+
| ID|  A|  Z|
+---+---+---+
|  1|100| 65|
|  1|100| 65|
|  5|450| 65|
|  9|250| 65|
+---+---+---+

我想得到下面的数据帧:

+---+---+----+-----+----+
| ID|  A|Date|Date2|   Z|
+---+---+----+-----+----+
|  9|250|null| null|  65|
|  5|450|2003| 2000|  65|
|  1|100|2015| 2000|  65|
|  1|100|2019| 2000|  65|
|  2|300|2002| 2000|null|
+---+---+----+-----+----+

我试过了:

new = df1.join(df2, ["ID","A"],how='full' )

这会让我:

+---+---+----+-----+----+
| ID|  A|Date|Date2|   Z|
+---+---+----+-----+----+
|  9|250|null| null|  65|
|  5|450|2003| 2000|  65|
|  2|300|2002| 2000|null|
|  1|100|2015| 2000|  65|
|  1|100|2015| 2000|  65|
|  1|100|2019| 2000|  65|
|  1|100|2019| 2000|  65|
+---+---+----+-----+----+

然后我使用以下方法消除重复项:

cols_join = new.columns
cols_join.remove("ID")
cols_join.remove("A")

new.dropDuplicates(subset=cols_join).show()

+---+---+----+-----+----+
| ID|  A|Date|Date2|   Z|
+---+---+----+-----+----+
|  9|250|null| null|  65|
|  5|450|2003| 2000|  65|
|  1|100|2015| 2000|  65|
|  1|100|2019| 2000|  65|
|  2|300|2002| 2000|null|
+---+---+----+-----+----+

有没有更好的方法?

我尝试了其他连接(左连接、内连接等。),但不会得到我想要的结果

还有,有没有更好的方法来消除重复行?

共有1个答案

芮宇航
2023-03-14

在这种情况下,完全连接是必须的,因为在结果数据帧中有来自df1和df2的ID、A。

因此,其他连接类型(左,左半..)是没有选项的。

我不认为有什么可以做得更好。

为了简化代码,您可以使用

new.dropDuplicates(['Date', 'Date2', 'Z'])
 类似资料:
  • 我有2个数据帧,和,有一个列(和其他非重要的)。 我想在中删除包含已在中的电子邮件的行。 我该怎么做?

  • 我有两个火花DF,我需要加入。只选择df1中存在的df2中的值,不应该有重复的行。 例如: df1: df2: 我正在做以下工作: 但是我的输出有几个重复的行。 如果val从df1中删除,我试图实现一个类似except的操作。但是除了之外,

  • 我想从两个表中删除相关的行。可能有外键,也可能没有。因此,可以肯定的是,我不想依赖外键及其在DELETE上的

  • 问题内容: 我有一个包含2个字段(名称,兴趣)的表,我想查找所有具有相同兴趣的对,并删除所有重复项和镜像对。 我可以找到所有对,并使用以下SQL语句删除重复项: 但是我不确定如何删除镜像对,即: 我试图使上面的语句成为一个称为Matches的视图,并尝试了以下查询: 但是它不会删除所有镜像对。 问题答案: 假设您不在乎哪个对最终会粘在(ben,will)与(will,ben)之间,那么我的首选解决

  • 问题内容: 我有一个包含两列的数据框,并且。在这种情况下,和的顺序并不重要;例如,我会考虑并将其重复。在熊猫中,从数据框中删除这些重复项的有效方法是什么? 理想情况下,输出将按column的值排序。 问题答案: 您可以在删除重复项之前对数据框的每一行进行排序: 如果您希望按列对结果进行排序:

  • 我试图创建一个图书馆管理系统,因为我创建了两个实体和这两个实体都是使用关系连接的,所以我使用了另一个联接表,在这里我存储了图书的Id和学生的Id,当学生从图书馆发出一本书时,但是当学生返回书时,联接表中包含这两个Id的行应该被删除,但是当我尝试这样做时,要么联接表中的所有数据都被删除,要么我的学生和图书在这里被删除了我的代码,请告诉我,我在这里做错了什么,什么应该是最好的实践 学生实体 图书实体