python - 当 pyspark 中两列的值是相同组合时删除行

标签 python pandas apache-spark pyspark

我有一个如下所示的 Spark 数据框。 (只是一个例子。我的真实数据有数百万行):

df = pd.DataFrame({'ZIP1': ['50069', '50069', '50704', '50704', '52403', '52403'],
              'ZIP2': ['50704', '52403', '50069', '52403', '50069', '50704'],
              'STATE': ['IA', 'IA', 'IA', 'IA', 'IA', 'IA'],
              'REGION': ['MIDWEST', 'MIDWEST', 'MIDWEST', 'MIDWEST', 'MIDWEST', 'MIDWEST'] } )
sdf = spark.createDataFrame(df)

    ZIP1    ZIP2    STATE   REGION
0   50069   50704   IA  MIDWEST
1   50069   52403   IA  MIDWEST
2   50704   50069   IA  MIDWEST
3   50704   52403   IA  MIDWEST
4   52403   50069   IA  MIDWEST
5   52403   50704   IA  MIDWEST

如果 ZIP1ZIP2 列中的两个邮政编码是相同的组合,我需要删除一行。例如,row 0row 2,邮政编码只是相同的组合,但顺序相反。我需要删除 row 0row 2。同样,删除行 1行 4....

有谁知道如何在 pyspark 中实现这一点?需要 Pyspark 解决方案。如果有人可以同时提供 pyspark 和 python 的解决方案,那就更好了。谢谢!

最佳答案

Pandas 解决方案

cols = ['ZIP1', 'ZIP2']
df[cols] = np.sort(df[cols], axis=1)
df.drop_duplicates(subset=cols)
结果
    ZIP1   ZIP2 STATE   REGION
0  50069  50704    IA  MIDWEST
1  50069  52403    IA  MIDWEST
3  50704  52403    IA  MIDWEST

Pyspark 解决方案

cols = ['ZIP1', 'ZIP2']
sdf.withColumn('arr', F.array_sort(F.array(*cols))).drop_duplicates(['arr']).drop('arr')
结果
| ZIP1| ZIP2|STATE| REGION|
+-----+-----+-----+-------+
|50069|50704|   IA|MIDWEST|
|50069|52403|   IA|MIDWEST|
|50704|52403|   IA|MIDWEST|
+-----+-----+-----+-------+

在这两种解决方案中,主要思想都是对 ZIP1ZIP2 列中的值进行排序,然后根据排序值删除重复项

关于python - 当 pyspark 中两列的值是相同组合时删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72926144/

相关文章:

Python 网页抓取; BeautifulSoup

python - 如何合并Series和DataFrame

python - 删除 python pandas 中的 NaN 值

java - Apache Spark 中的 spark.storage.memoryFraction 设置

apache-spark - 如何在pyspark中将行转换为字典列表?

python - 是否可以使 `type` 的输出返回不同的类?

python - 迭代product()的元组元素

python - Pandas :根据多级首次出现合并数据框

python - 在 Pandas 数据框中重置索引计数

java - 并行处理 DStream 中的 RDD