【问题标题】:How would I subtract N specific rows from a PySpark DataFrame?如何从 PySpark DataFrame 中减去 N 个特定行?
【发布时间】:2021-12-26 07:50:43
【问题描述】:

我有一个数据框nsdf,我想从中抽取 5% 的样本。 nsdf 看起来像这样:

col1 8 7 7 8 7 8 8 7 (... 等等)

我像这样采样nsdf

sdf = nsdf.sample(0.05)

然后我想从nsdf 中删除sdf 中的行。现在,在这里我想我可以使用nsdf.subtract(sdf),但这会删除nsdf 中与sdf 中的任何行匹配的所有 行。例如,如果包含sdf

col1 7 8

然后,nsdf 中的 每一 行将被删除,因为它们都是 7 或 8。有没有办法删除 7 的数量出现在sdf 中的/8(或其他)?更具体地说,在此示例中,我希望得到一个 nsdf,它包含相同的数据,但少一个 7 和一个少 8 个。

【问题讨论】:

  • 你不能只做一个nsdf.sample(0.95) 来获得想要的结果还是我错过了什么?
  • @RicS 我不确定这是否是一种选择,尽管我很欣赏这种洞察力。我想我仍然必须使用exceptAll() 而不是subtract() 在存在重复行的情况下删除采样行。

标签: python dataframe pyspark sample


【解决方案1】:

subtract 的行为是删除左侧数据框中某行的所有实例(如果存在于右侧数据框中)。你要找的是exceptAll

示例:

数据设置

df = spark.createDataFrame([(7,), (8,), (7,), (8,)], ("col1", ))

场景一:


df1 = spark.createDataFrame([(7,), (8,)], ("col1", ))

df.exceptAll(df1).show()

输出

+----+
|col1|
+----+
|   7|
|   8|
+----+

场景 2:

df2 = spark.createDataFrame([(7,), (7,), (8,)], ("col1", ))

df.exceptAll(df2).show()

输出

+----+
|col1|
+----+
|   8|
+----+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 2021-12-11
    • 1970-01-01
    • 2021-10-03
    • 2020-09-24
    • 2015-06-14
    相关资源
    最近更新 更多