【发布时间】:2019-03-07 14:41:15
【问题描述】:
背景: 我需要使用 isin 函数根据包含另一个数据框列的内容过滤数据框。
对于使用 pandas 的 Python 用户,这将是:isin()。
对于 R 用户,这将是:%in%。
所以我有一个带有 id 和 value 列的简单 spark 数据框:
l = [(1, 12), (1, 44), (1, 3), (2, 54), (3, 18), (3, 11), (4, 13), (5, 78)]
df = spark.createDataFrame(l, ['id', 'value'])
df.show()
+---+-----+
| id|value|
+---+-----+
| 1| 12|
| 1| 44|
| 1| 3|
| 2| 54|
| 3| 18|
| 3| 11|
| 4| 13|
| 5| 78|
+---+-----+
我想获取所有出现多次的 id。这是df中唯一ID的数据框:
unique_ids = df.groupBy('id').count().where(col('count') < 2)
unique_ids.show()
+---+-----+
| id|count|
+---+-----+
| 5| 1|
| 2| 1|
| 4| 1|
+---+-----+
所以逻辑运算是:
df = df[~df.id.isin(unique_ids.id)]
# This is the same than:
df = df[df.id.isin(unique_ids.id) == False]
但是,我得到一个空数据框:
df.show()
+---+-----+
| id|value|
+---+-----+
+---+-----+
这个“错误”以相反的方式起作用:
df[df.id.isin(unique_ids.id)]
返回df的所有行。
【问题讨论】:
-
不要在这里使用
isin- 使用join。例如:df.join(unique_ids, on="id").show()。isin只能用于文字值(例如:df.where(df["id"].isin([1, 2, 3]))),不能用于列。
标签: python apache-spark pyspark apache-spark-sql pyspark-sql