首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >火花放电drop_duplicates(keep=False)

火花放电drop_duplicates(keep=False)
EN

Stack Overflow用户
提问于 2019-01-09 18:45:19
回答 2查看 1.5K关注 0票数 1

我需要一个用于潘达斯 drop_duplicates(keep=False)解决方案。不幸的是,keep=False选项无法在pyspark中使用..。

Pandas示例:

代码语言:javascript
复制
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)

预期产出:

代码语言:javascript
复制
     A  B       C
2  bar  5  three

转换.to_pandas()并将其返回到pyspark并不是一个选项。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-09 19:00:49

使用window函数计算每个A / B组合的行数,然后过滤结果,只保留唯一的行:

代码语言:javascript
复制
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的另一个选项

代码语言:javascript
复制
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|
+---+---+-----+
票数 2
EN

Stack Overflow用户

发布于 2020-10-06 11:32:26

简单的方法是对这些行进行计数,然后只选择有一次出现的行,以避免重复列中的任何行,然后删除额外的列。

代码语言:javascript
复制
df= df.groupBy('A', 'B').agg(f.expr('count(*)').alias('Frequency'))
df=df.select('*').where(df.Frequency==1)
df=df.drop('Frequency')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54116465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档