Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PySpark中是否有.any()等价物?_Python_Pandas_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Python PySpark中是否有.any()等价物?

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

我想知道是否有办法在Pyspark中使用
.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"))

可以使用窗口函数(如果至少有一个真值,则布尔值的最大值为真):


或groupby
id
,使用
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")