我有一个pyspark数据框,例如:
A B B C
1 NA不适用9
4 2 2 5
6 4 4 2
5 1 NA
我要删除包含值“ NA”的行。在这种情况下,第一行和最后一行。如何使用Python和Spark来实现这一点?
根据评论更新: 寻找一种解决方案,以删除具有字符串的行:NA在许多列中的任何一列。
答案 0 :(得分:0)
只需使用数据框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()
答案 1 :(得分:0)
在Scala中,我做了不同的事情,但是使用pyspark做到了。不是我最喜欢的答案,而是因为我这一边的pyspark知识较少。在Scala中,事情似乎更轻松。与数组不同,对所有可以找到的列都不会立即停止的全局匹配。动态列数。
对不具有~~作为数据一部分的数据的假设可能已拆分为数组,但决定不在此处进行。 使用None代替NA 。
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|
+---+---+---+---+