如何在基于另一个DataFrame的列上删除DataFrame中的行?

昆汀·普拉德(Quentin Pradet)

我正在尝试在Spark 1.6.1中使用SQLContext.subtract()基于另一个数据框中的列从数据框中删除行。让我们举个例子:

from pyspark.sql import Row

df1 = sqlContext.createDataFrame([
    Row(name='Alice', age=2),
    Row(name='Bob', age=1),
]).alias('df1')

df2 = sqlContext.createDataFrame([
    Row(name='Bob'),
])

df1_with_df2 = df1.join(df2, 'name').select('df1.*')
df1_without_df2 = df1.subtract(df1_with_df2)

由于我希望所有df1不包括在内的行都在name='Bob'我的期望之中Row(age=2, name='Alice')但是我还检索了鲍勃:

print(df1_without_df2.collect())
# [Row(age='1', name='Bob'), Row(age='2', name='Alice')]

经过各种实验以了解此MCVE,我发现问题出在age关键。如果我忽略它:

df1_noage = sqlContext.createDataFrame([
    Row(name='Alice'),
    Row(name='Bob'),
]).alias('df1_noage')

df1_noage_with_df2 = df1_noage.join(df2, 'name').select('df1_noage.*')
df1_noage_without_df2 = df1_noage.subtract(df1_noage_with_df2)
print(df1_noage_without_df2.collect())
# [Row(name='Alice')]

然后我只得到预期的爱丽丝。我所做的最奇怪的观察是,可以添加键,只要它们在连接中使用了键之后(按字典顺序的意义):

df1_zage = sqlContext.createDataFrame([
    Row(zage=2, name='Alice'),
    Row(zage=1, name='Bob'),
]).alias('df1_zage')

df1_zage_with_df2 = df1_zage.join(df2, 'name').select('df1_zage.*')
df1_zage_without_df2 = df1_zage.subtract(df1_zage_with_df2)
print(df1_zage_without_df2.collect())
# [Row(name='Alice', zage=2)]

我正确地得到了爱丽丝(和她的zage)!在我的实际示例中,我对所有列都感兴趣,而不仅仅是after之后的那些列name

零323

好吧,这里有一些错误(第一个问题似乎与SPARK-6231涉及相同的问题),JIRA看起来是个好主意,但SUBTRACT/EXCEPT不是部分匹配的正确选择。

相反,从Spark 2.0开始,您可以使用anti-join:

df1.join(df1_with_df2, ["name"], "leftanti").show()

在1.6中,您可以使用标准外部联接执行几乎相同的操作:

import pyspark.sql.functions as F

ref = df1_with_df2.select("name").alias("ref")

(df1
    .join(ref, ref.name == df1.name, "leftouter")
    .filter(F.isnull("ref.name"))
    .drop(F.col("ref.name")))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在基于另一个DataFrame的列上删除DataFrame中的行?

来自分类Dev

DataFrame中的新列基于另一个DataFrame中的行和列

来自分类Dev

如何基于另一个DataFrame中的值更新DataFrame中的值?

来自分类Dev

如何基于Pandas中的另一个DataFrame更改DataFrame的某些列中的值

来自分类Dev

如何基于另一个 DataFrame 中的列在 Pandas DataFrame 中创建新列?

来自分类Dev

根据另一个 Dataframe 中的条件删除 Dataframe 中的行

来自分类Dev

如何使用Python根据另一个DataFrame中的行选择DataFrame中的行

来自分类Dev

Python Pandas 在一个基于另一个 df 的 df 中删除行

来自分类Dev

基于 Pandas 中的另一个 DataFrame 修改 DataFrame

来自分类Dev

如何在Pandas Dataframe中获取最接近另一个值的值

来自分类Dev

使用另一个DataFrame从Python中的DataFrame删除记录

来自分类Dev

如何在DataFrame中有效搜索值并将其放入另一个DataFrame中

来自分类Dev

如何在Pandas DataFrame的wrt索引和另一个DataFrame的列中映射数据

来自分类Dev

从分组框中的另一个DataFrame的每一行创建DataFrame?

来自分类Dev

如何从另一个文件中删除基于字符串列表的多个文本文件的行?

来自分类Dev

基于另一个表中的查找值删除表中的行

来自分类Dev

如何为基于另一个 DataFrame 的字符串创建标签列?

来自分类Dev

python&pandas-删除行,其中列值是另一个DataFrame中的索引值

来自分类Dev

如何在Excel中基于另一个单元格的值将值重复到行中

来自分类Dev

如何删除基于另一个数据框的行?

来自分类Dev

如何在不使用for循环的情况下基于来自另一个Dataframe的值对pandas DataFrame进行切片?

来自分类Dev

如何更新从另一个表中的一个表删除的行?

来自分类Dev

如何从一个表中删除与另一个表匹配的行?

来自分类Dev

如何根据另一个表的值删除一个表中的行

来自分类Dev

如何在Javascript中的表中同一行的其他列上获取对另一个对象的引用?

来自分类Dev

如何基于另一个数组删除或屏蔽numpy数组中的值

来自分类Dev

如何删除基于.net中的另一个数据表的一个数据表行?

来自分类Dev

如何在不写入Java中另一个文件的情况下删除文件的一行

来自分类Dev

基于唯一的多列索引的另一个DataFrame的新pandas DataFrame

Related 相关文章

  1. 1

    如何在基于另一个DataFrame的列上删除DataFrame中的行?

  2. 2

    DataFrame中的新列基于另一个DataFrame中的行和列

  3. 3

    如何基于另一个DataFrame中的值更新DataFrame中的值?

  4. 4

    如何基于Pandas中的另一个DataFrame更改DataFrame的某些列中的值

  5. 5

    如何基于另一个 DataFrame 中的列在 Pandas DataFrame 中创建新列?

  6. 6

    根据另一个 Dataframe 中的条件删除 Dataframe 中的行

  7. 7

    如何使用Python根据另一个DataFrame中的行选择DataFrame中的行

  8. 8

    Python Pandas 在一个基于另一个 df 的 df 中删除行

  9. 9

    基于 Pandas 中的另一个 DataFrame 修改 DataFrame

  10. 10

    如何在Pandas Dataframe中获取最接近另一个值的值

  11. 11

    使用另一个DataFrame从Python中的DataFrame删除记录

  12. 12

    如何在DataFrame中有效搜索值并将其放入另一个DataFrame中

  13. 13

    如何在Pandas DataFrame的wrt索引和另一个DataFrame的列中映射数据

  14. 14

    从分组框中的另一个DataFrame的每一行创建DataFrame?

  15. 15

    如何从另一个文件中删除基于字符串列表的多个文本文件的行?

  16. 16

    基于另一个表中的查找值删除表中的行

  17. 17

    如何为基于另一个 DataFrame 的字符串创建标签列?

  18. 18

    python&pandas-删除行,其中列值是另一个DataFrame中的索引值

  19. 19

    如何在Excel中基于另一个单元格的值将值重复到行中

  20. 20

    如何删除基于另一个数据框的行?

  21. 21

    如何在不使用for循环的情况下基于来自另一个Dataframe的值对pandas DataFrame进行切片?

  22. 22

    如何更新从另一个表中的一个表删除的行?

  23. 23

    如何从一个表中删除与另一个表匹配的行?

  24. 24

    如何根据另一个表的值删除一个表中的行

  25. 25

    如何在Javascript中的表中同一行的其他列上获取对另一个对象的引用?

  26. 26

    如何基于另一个数组删除或屏蔽numpy数组中的值

  27. 27

    如何删除基于.net中的另一个数据表的一个数据表行?

  28. 28

    如何在不写入Java中另一个文件的情况下删除文件的一行

  29. 29

    基于唯一的多列索引的另一个DataFrame的新pandas DataFrame

热门标签

归档