我在 Apache Spark SQL 中有一个 DataFrame,我想在其中删除所有非 None 值都相同的所有列。
所以在一个虚拟示例中
df
| A | B | C |
1 2 3
NaN 2 4
1 2 NaN
1 2 5
我只想保留 C 列
df_filter
| C |
3
4
NaN
5
在 Python 中,我会按以下方式进行
nunique = df.fillna(df.median()).nunique()
cols_to_drop = nunique[nunique == 1].index
df = df.drop(cols_to_drop, axis=1)
但是我该如何在 Apache Spark SQL DataFrame (Scala) 中做到这一点?
最佳答案
一种方法是在所有列上使用 countDistinct
。该函数本身会忽略 null
值:
val uniqueCounts = df
.select(df.columns.map(c => countDistinct(col(c)) as c): _*)
.head
val nonUniqueCols = df.columns
.filter(c => uniqueCounts.getAs[Long](c) > 1)
val df_filter = df.select(nonUniqueCols.map(col) : _*)
df_filter.show
请注意,如果您有 NaN
(不是数字)值且不是 null
值,它们不会被 countDistinct
忽略。如果您希望它们如此,请将 countDistinct(col(c))
替换为 countDistinct(when(col(c) !== Double.NaN,col(c)))
将 NaN
值转换为 null
值。
关于scala - 在 Apache Spark DataFrame 中,如何删除所有非 None 值都相同的所有列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69740302/