Python PySpark中是否有.any()等价物?
我想知道是否有办法在Pyspark中使用Python PySpark中是否有.any()等价物?,python,pandas,apache-spark,pyspark,apache-spark-sql,Python,Pandas,Apache Spark,Pyspark,Apache Spark Sql,我想知道是否有办法在Pyspark中使用.any() 我用Python编写了以下代码,它基本上搜索子集数据帧中感兴趣的特定列,如果其中任何列包含“AD”,我们就不想处理它们 以下是Python中的代码: index_list = [ df.query("id == @id").index for trial in unique_trial_id_list if ~(df.query("id == @trial")["u
.any()
我用Python编写了以下代码,它基本上搜索子集数据帧中感兴趣的特定列,如果其中任何列包含“AD”
,我们就不想处理它们
以下是Python中的代码:
index_list = [
df.query("id == @id").index
for trial in unique_trial_id_list
if ~(df.query("id == @trial")["unit"].str.upper().str.contains("AD").any()]
下面是熊猫中的一个示例数据帧
ID=1
具有与其关联的字符串'AD'
,因此我们希望将其从处理中排除。但是,ID=2
没有与之关联的字符串'AD'
,因此我们希望在进一步处理中包含它
data = [
[1, "AD"],
[1, "BC"],
[1, "DE"],
[1, "FG"],
[2, "XY"],
[2, "BC"],
[2, "DE"],
[2, "FG"],
]
df = pd.DataFrame(data, columns=["ID", "Code"])
df
问题是我不知道如何在PySpark中实现这个等价函数。我已经能够对子集进行列表理解,并且能够使用contains('AD')
对子集进行理解,但是当涉及到事物的任何部分时,我就被卡住了
我想出的Pypark代码:
id = id_list[0]
test = sdf.select(["ID", "Codes"]).filter(spark_fns.col("ID") == id).filter(~spark_fns.col("Codes").str.contains("AD"))
可以使用窗口函数(如果至少有一个真值,则布尔值的最大值为真):
或groupbyid
,使用max
函数和when
表达式过滤code
列中包含AD
的id,然后与原始df连接:
from pyspark.sql import functions as F
filter_df = df.groupBy("id").agg(
F.max(F.when(F.col("Code") == "AD", True).otherwise(False)).alias("to_exclude")
).filter(F.col("to_exclude"))
df1 = df.join(filter_df, ["id"], "left_anti")
在Spark 3+中,还有一个函数any
:
from pyspark.sql import functions as F
filter_df = df.groupBy("id").agg(
F.expr("any(Code = 'AD')").alias("to_exclude")
).filter(F.col("to_exclude"))
df1 = df.join(filter_df, ["id"], "left_anti")
您也可以尝试这样做-1)查找代码列包含AD的所有ID值,2)通过左反联接过滤出具有此类ID的行
df = pd.DataFrame(data, columns=["ID", "Code"])
df_psp = spark.createDataFrame(df)
cols = ["ID"]
df_filter = df_psp.filter(F.col("Code").like('%AD%')).select(cols).distinct()
df_out = df_psp.join(df_filter, cols, "left_anti")
df = pd.DataFrame(data, columns=["ID", "Code"])
df_psp = spark.createDataFrame(df)
cols = ["ID"]
df_filter = df_psp.filter(F.col("Code").like('%AD%')).select(cols).distinct()
df_out = df_psp.join(df_filter, cols, "left_anti")