python - Pyspark drop_duplicates(保持=假)
问题描述
我需要 Pandas 的Pyspark解决方案drop_duplicates(keep=False)
。不幸的是,该keep=False
选项在 pyspark 中不可用...
熊猫示例:
import pandas as pd
df_data = {'A': ['foo', 'foo', 'bar'],
'B': [3, 3, 5],
'C': ['one', 'two', 'three']}
df = pd.DataFrame(data=df_data)
df = df.drop_duplicates(subset=['A', 'B'], keep=False)
print(df)
预期输出:
A B C
2 bar 5 three
转换.to_pandas()
并返回 pyspark 不是一种选择。
谢谢!
解决方案
使用窗口函数计算每个组合的行数A / B
,然后过滤结果以仅保留唯一的行:
import pyspark.sql.functions as f
df.selectExpr(
'*',
'count(*) over (partition by A, B) as cnt'
).filter(f.col('cnt') == 1).drop('cnt').show()
+---+---+-----+
| A| B| C|
+---+---+-----+
|bar| 5|three|
+---+---+-----+
或使用其他选项pandas_udf
:
from pyspark.sql.functions import pandas_udf, PandasUDFType
# keep_unique returns the data frame if it has only one row, otherwise
# drop the group
@pandas_udf(df.schema, PandasUDFType.GROUPED_MAP)
def keep_unique(df):
return df.iloc[:0] if len(df) > 1 else df
df.groupBy('A', 'B').apply(keep_unique).show()
+---+---+-----+
| A| B| C|
+---+---+-----+
|bar| 5|three|
+---+---+-----+
推荐阅读
- ios - swift中的框架代表
- ios - iOS 位置管理器 - isAuthorizedForPreciseLocation 似乎不存在
- python - 有没有办法在 python 的 .txt 文件中写入每个警告?
- c# - 在 CSharp 和 Java 中将字符串转换为 Long
- python - 使用 Gridsearch 进行 RFE 排名
- python - 我面临 ValueError:形状 (1, 14) 和 (1, 139, 14) 不兼容
- nuxt.js - Nuxt - 自定义资产文件夹
- linux - ssh 不启动,错误的配置选项
- php - 如何在没有 htacces 重写的情况下回显真实 url
- ruby-on-rails - 如何添加 has_many 关联以在创建时记录?