当前位置:  开发笔记 > 编程语言 > 正文

使用isin排除过滤pyspark数据帧

如何解决《使用isin排除过滤pyspark数据帧》经验,为你挑选了4个好方法。

我试图获取数据框中的所有行,其中列值不在列表中(因此通过排除进行过滤).

举个例子:

df = sqlContext.createDataFrame([('1','a'),('2','b'),('3','b'),('4','c'),('5','d')]
,schema=('id','bar'))

我得到了数据框:

+---+---+
| id|bar|
+---+---+
|  1|  a|
|  2|  b|
|  3|  b|
|  4|  c|
|  5|  d|
+---+---+

我只想排除bar所在的行('a'或'b').

使用SQL表达式字符串,它将是:

df.filter('bar not in ("a","b")').show()

有没有办法在不使用SQL表达式的字符串或一次排除一个项目的情况下执行此操作?

编辑:

我可能有一个列表,['a','b'],我想要使用的排除值.



1> gabrown86..:

看起来〜给出了我需要的功能,但我还没有找到任何适当的文档.

df.filter(~col('bar').isin(['a','b'])).show()



+---+---+
| id|bar|
+---+---+
|  4|  c|
|  5|  d|
+---+---+


它是一个默认的python运算符,在民间语言中称为"not"运算符.在文档中,它被称为"一元按位反转运算符":http://docs.python.org/reference/expressions.html#unary-arithmetic-and-bitwise-operations

2> Alezis..:

也可能是这样的

df.filter(col('bar').isin(['a','b']) == False).show()


在这种情况下,我认为没有真正的区别,因为“ isin”返回“ True”或“ False”。但是,通常不鼓励类似x == False的比较,并且可能会产生令人惊讶的结果。

3> 小智..:

对于那些在Pandas拥有顶空并搬到pyspark的人来说,他们已经陷入困境了

 from pyspark import SparkConf, SparkContext
 from pyspark.sql import SQLContext

 spark_conf = SparkConf().setMaster("local").setAppName("MyAppName")
 sc = SparkContext(conf = spark_conf)
 sqlContext = SQLContext(sc)

 records = [
     {"colour": "red"},
     {"colour": "blue"},
     {"colour": None},
 ]

 pandas_df = pd.DataFrame.from_dict(records)
 pyspark_df = sqlContext.createDataFrame(records)

所以如果我们想要不是红色的行:

pandas_df[~pandas_df["colour"].isin(["red"])]

正如熊猫所料

看起来不错,在我们的pyspark DataFrame中

pyspark_df.filter(~pyspark_df["colour"].isin(["red"])).collect()

不是我的预期

经过一番挖掘,我发现了这个:https://issues.apache.org/jira/browse/SPARK-20617 所以要在我们的结果中包含虚无:

pyspark_df.filter(~pyspark_df["colour"].isin(["red"]) | pyspark_df["colour"].isNull()).show()

无所事事



4> Assaf Mendel..:
df.filter((df.bar != 'a') & (df.bar != 'b'))

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有