如何检查一个数据帧中一列的值是否仅包含另一个数据帧中一列中的值

时间:2019-07-23 11:46:27

标签: pyspark pyspark-sql

我有一个包含3列fname,lname,zip的数据框(df1)。

 fname  lname zip
 ty      zz   123
 rt      kk   345
 yu      pp   678

另一个master_df,仅包含邮政编码列表。

 zip_codes
 123
 345
 555
 667

我想编写一个pyspark sql代码,以检查df1中存在的邮政编码是否是主列表中提到的邮政编码。主机中不存在的任何内容都应放入另一个数据帧。

我尝试过:

df3 = df1.filter(df1["zip"]!=master["zip_codes"])

我所需的output_df应该显示 678 ,因为它不存在于master_df中

3 个答案:

答案 0 :(得分:1)

df2=df1.join(master,(df1.zip==master.zip_codes),'left_outer').where(master['zip_codes'].isNull())
df2.show()
+-----+-----+---+--------=+
|fname|lname|zip|zip_codes|
+-----+-----+---+---------+
|   yu|   pp|678|     null|
+-----+-----+---+---------+

答案 1 :(得分:1)

您可以在此处使用减法。这是我的代码段。

.Range("A:A").AutoFilter Field:=31, Criteria1:="*" & cell.Value & "*", Operator:=xlOr

这将创建一个新的数据框,其中包含邮政编码中未包含的所有邮政编码。

答案 2 :(得分:0)

让我知道这是否有帮助:

zip_codes = master_df.select(['zip_codes']).rdd.flatMap(lambda x :x).collect()

@F.udf(StringType())
def increment(x):
    if x in zip_codes:
        return("True")
    else:
        return("False")

TableA = TableA.withColumn('zip_presence', increment('zip'))

df_with_zipcode_match = TableA.filter(TableA['zip_presence'] == "True").drop('zip_presence')
df_without_zipcode_match = TableA.filter(TableA['zip_presence'] == "False").drop('zip_presence')


df_with_zipcode_match.show()
df_without_zipcode_match.show()


#### Input DFs####
+---------+-----+---+
|    fname|lname|zip|
+---------+-----+---+
|       ty|   zz|123|
|   Monkey|   kk|345|
|    Ninja|   pp|678|
|Spaghetti|  pgp|496|
+---------+-----+---+


+---------+
|zip_codes|
+---------+
|      123|
|      345|
|      555|
|      667|
+---------+


#### Output DFs####
+------+-----+---+
| fname|lname|zip|
+------+-----+---+
|    ty|   zz|123|
|Monkey|   kk|345|
+------+-----+---+


+---------+-----+---+
|    fname|lname|zip|
+---------+-----+---+
|    Ninja|   pp|678|
|Spaghetti|  pgp|496|
+---------+-----+---+