[英]Keep groups where at least one element satisfies condition in pyspark
我一直试图在 pyspark 中重现一些在 Pandas 中很容易做到的事情,但我已经挣扎了一段时间。 假设我有以下数据框:
df = pd.DataFrame({'a':[1,2,2,1,1,2], 'b':[12,5,1,19,2,7]})
print(df)
a b
0 1 12
1 2 5
2 2 1
3 1 19
4 1 2
5 2 7
还有名单
l = [5,1]
我想要做的是按a
分组,如果b
中的任何元素在列表中,则为组中的所有值返回True
。 然后我们可以使用结果来索引数据帧。 与此相当的 Pandas 将是:
df[df.b.isin(l).groupby(df.a).transform('any')]
a b
1 2 5
2 2 1
5 2 7
pyspark 中可重现的数据框:
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
df = pd.DataFrame({'a':[1,2,2,1,1,2], 'b':[12,5,1,19,2,7]})
sparkdf = spark.createDataFrame(df)
我目前正朝着按a
分组并应用 pandasUDF 的方向前进,尽管肯定有更好的方法可以仅使用 spark 来做到这一点。
我想出了一个足够简单的解决方案。 第一步是使用isin
和filter
过滤掉b
中的值在列表中的行,然后将唯一的分组键 ( a
) 保留在列表中。
然后,通过合并与数据框后面a
我们保持列表中包含的组:
unique_a = (sparkdf.filter(f.col('b').isin(l))
.select('a').distinct())
sparkdf.join(unique_a, 'a').show()
+---+---+
| a| b|
+---+---+
| 2| 5|
| 2| 1|
| 2| 7|
+---+---+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.