gpt4 book ai didi

python-2.7 - Pyspark 按另一个数据帧的列过滤数据帧

转载 作者:行者123 更新时间:2023-12-02 22:32:23 25 4
gpt4 key购买 nike

不知道为什么我在这方面遇到了困难,考虑到在 R 或 pandas 中相当容易做到,它看起来很简单。不过,我想避免使用 pandas,因为我正在处理大量数据,并且我相信 toPandas() 会将所有数据加载到 pyspark 中的驱动程序内存中。

我有 2 个数据帧:df1df2。我想过滤 df1(删除所有行),其中 df1.userid = df2.userid AND df1.group = df2.group。我不确定是否应该使用 filter()join()sql 例如:

df1:
+------+----------+--------------------+
|userid| group | all_picks |
+------+----------+--------------------+
| 348| 2|[225, 2235, 2225] |
| 567| 1|[1110, 1150] |
| 595| 1|[1150, 1150, 1150] |
| 580| 2|[2240, 2225] |
| 448| 1|[1130] |
+------+----------+--------------------+

df2:
+------+----------+---------+
|userid| group | pick |
+------+----------+---------+
| 348| 2| 2270|
| 595| 1| 2125|
+------+----------+---------+

Result I want:
+------+----------+--------------------+
|userid| group | all_picks |
+------+----------+--------------------+
| 567| 1|[1110, 1150] |
| 580| 2|[2240, 2225] |
| 448| 1|[1130] |
+------+----------+--------------------+

编辑:我尝试过很多 join() 和 filter() 函数,我相信我得到的最接近的是:

cond = [df1.userid == df2.userid, df2.group == df2.group]
df1.join(df2, cond, 'left_outer').select(df1.userid, df1.group, df1.all_picks) # Result has 7 rows

我尝试了很多不同的连接类型,也尝试了不同的

cond values:
cond = ((df1.userid == df2.userid) & (df2.group == df2.group)) # result has 7 rows
cond = ((df1.userid != df2.userid) & (df2.group != df2.group)) # result has 2 rows

但是,连接似乎是添加额外的行,而不是删除。

我正在使用 python 2.7spark 2.1.0

最佳答案

左反连接是您正在寻找的:

df1.join(df2, ["userid", "group"], "leftanti")

但是使用左外连接可以完成同样的事情:

(df1
.join(df2, ["userid", "group"], "leftouter")
.where(df2["pick"].isNull())
.drop(df2["pick"]))

关于python-2.7 - Pyspark 按另一个数据帧的列过滤数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42148583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com