如何检查一个数据框中列的值是否仅包含另一个数据框中列中的值
how to check if values of a column in one dataframe contains only the values present in a column in another dataframe
我有一个包含 3 列 fname、lname、zip 的数据框 (df1)。
fname lname zip
ty zz 123
rt kk 345
yu pp 678
另一个 master_df 只有 zip_codes 的列表。
zip_codes
123
345
555
667
我想编写一个 pyspark sql 代码来检查 df1 中存在的邮政编码是否是主列表中提到的那些。 master 中不存在的任何一个都应该进入另一个数据帧。
我试过了:
df3 = df1.filter(df1["zip"]!=master["zip_codes"])
我需要的 output_df 应该显示 678 因为它不存在于 master_df
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|
+-----+-----+---+---------+
如果有帮助请告诉我:
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|
+---------+-----+---+
你可以在这里使用减法。这是我的代码片段。
from pyspark.sql import SparkSession
SS = SparkSession.builder.getOrCreate()
data_1 = [
{"fname": "ty", "lname": "zz", "zip": 123},
{"fname": "rt", "lname": "kk", "zip": 345},
{"fname": "yu", "lname": "pp", "zip": 678}]
data_2 = [
{"zip": 123},
{"zip": 345},
{"zip": 555},
{"zip": 667},]
# Creating dataframes
df_1 = SS.createDataFrame(data_1)
df_2 = SS.createDataFrame(data_2)
# Creating dataframe with only zip
df_1_sliced = df_1.select("zip")
# Finding the difference
df_diff = df_1_sliced.subtract(df_2)
df_diff.show() # Count should be zero
+---+
|zip|
+---+
|678|
+---+
这将创建一个新数据框,其中包含邮政编码中不存在的所有邮政编码。
我有一个包含 3 列 fname、lname、zip 的数据框 (df1)。
fname lname zip
ty zz 123
rt kk 345
yu pp 678
另一个 master_df 只有 zip_codes 的列表。
zip_codes
123
345
555
667
我想编写一个 pyspark sql 代码来检查 df1 中存在的邮政编码是否是主列表中提到的那些。 master 中不存在的任何一个都应该进入另一个数据帧。
我试过了:
df3 = df1.filter(df1["zip"]!=master["zip_codes"])
我需要的 output_df 应该显示 678 因为它不存在于 master_df
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|
+-----+-----+---+---------+
如果有帮助请告诉我:
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|
+---------+-----+---+
你可以在这里使用减法。这是我的代码片段。
from pyspark.sql import SparkSession
SS = SparkSession.builder.getOrCreate()
data_1 = [
{"fname": "ty", "lname": "zz", "zip": 123},
{"fname": "rt", "lname": "kk", "zip": 345},
{"fname": "yu", "lname": "pp", "zip": 678}]
data_2 = [
{"zip": 123},
{"zip": 345},
{"zip": 555},
{"zip": 667},]
# Creating dataframes
df_1 = SS.createDataFrame(data_1)
df_2 = SS.createDataFrame(data_2)
# Creating dataframe with only zip
df_1_sliced = df_1.select("zip")
# Finding the difference
df_diff = df_1_sliced.subtract(df_2)
df_diff.show() # Count should be zero
+---+
|zip|
+---+
|678|
+---+
这将创建一个新数据框,其中包含邮政编码中不存在的所有邮政编码。