我试图通过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|
+---+---+----+-----+----+
有没有更好的方法?
我尝试了其他连接(左连接、内连接等。),但不会得到我想要的结果
还有,有没有更好的方法来消除重复行?
在这种情况下,完全连接是必须的,因为在结果数据帧中有来自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的行应该被删除,但是当我尝试这样做时,要么联接表中的所有数据都被删除,要么我的学生和图书在这里被删除了我的代码,请告诉我,我在这里做错了什么,什么应该是最好的实践 学生实体 图书实体