将包含特定值的行放置在Pyspark DataFrame中



我有一个pyspark dataframe,例如:

a       nbsp; nbsp;1   na    nbsp; nbsp; 9
4   2        5
6   nbsp;     nbsp; nbsp; 2
5   1   nbsp; na

我想删除包含值" na"的行。在这种情况下,首先是最后一行。如何使用Python和Spark实施此功能?


根据评论更新:寻找一个解决方案,该解决方案可以去除具有字符串的行:在许多列中的任何一个中。

只需使用dataframe filter表达式:

l = [('1','NA','9')
    ,('4','2', '5')
    ,('6','4','2')
    ,('5','NA','1')]
df = spark.createDataFrame(l,['A','B','C'])
#The following command requires that the checked columns are strings!
df = df.filter((df.A != 'NA') & (df.B != 'NA') & (df.C != 'NA'))
df.show()
+---+---+---+ 
|  A|  B|  C| 
+---+---+---+ 
|  4|  2|  5| 
|  6|  4|  2| 
+---+---+---+

@bluephantom:如果您有数百列,只需通过列表理解生成字符串表达式:

#In my example are columns need to be checked
listOfRelevantStringColumns = df.columns
expr = ' and '.join('(%s != "NA")' % col_name for col_name in listOfRelevantStringColumns)
df.filter(expr).show()

在Scala I中,我这样做了,但是使用Pyspark来完成此操作。不是我最喜欢的答案,而是因为我的身边较少。在Scala中,情况似乎更容易。与数组不同,没有与所有列的全局匹配,可以在发现的所有列中停止。列数量的动态。

对没有~~作为数据一部分的数据做出的假设,可以分为数组,但决定不在此处进行。使用无代替

from pyspark.sql import functions as f
data = [(1,    None,    4,    None),
        (2,    'c',     3,    'd'),
        (None, None,    None, None),
        (3,    None,    None, 'z')]
df = spark.createDataFrame(data, ['k', 'v1', 'v2', 'v3'])
columns = df.columns
columns_Count = len(df.columns)
# colCompare is String
df2 = df.select(df['*'], f.concat_ws('~~', *columns).alias('colCompare') )
df3 = df2.filter(f.size(f.split(f.col("colCompare"), r"~~"))  == columns_Count).drop("colCompare")
df3.show()

返回:

+---+---+---+---+
|  k| v1| v2| v3|
+---+---+---+---+
|  2|  c|  3|  d|
+---+---+---+---+

如果要删除行

df = df.filter((df.A != 'NA') | (df.B != 'NA'))

,但有时我们需要用平均值(如果是数字列)或最频繁的值替换(如果是分类的)。为之

from pyspark.sql.functions import mean,col,when,count
df=df.withColumn("A",when(df.A=="NA",mean(df.A)).otherwise(df.A))

相关内容

  • 没有找到相关文章

最新更新