我有一个数据框,其列数约为400,我想根据我的要求删除100列。 所以我创建了一个包含100个列名的Scala列表。 然后我想迭代一个for循环来实际删除每个for循环迭代中的列。
以下是代码。
final val dropList: List[String] = List("Col1","Col2",...."Col100”)
def drpColsfunc(inputDF: DataFrame): DataFrame = {
for (i <- 0 to dropList.length - 1) {
val returnDF = inputDF.drop(dropList(i))
}
return returnDF
}
val test_df = drpColsfunc(input_dataframe)
test_df.show(5)
答案 0 :(得分:15)
<强>答案:强>
val colsToRemove = Seq("colA", "colB", "colC", etc)
val filteredDF = df.select(df.columns .filter(colName => !colsToRemove.contains(colName)) .map(colName => new Column(colName)): _*)
答案 1 :(得分:14)
如果您只想做一些比删除多个命名列更复杂的事情,而不是按特定条件选择它们,您可以简单地执行以下操作:
df.drop("colA", "colB", "colC")
答案 2 :(得分:1)
这应该可以正常工作:
val dropList : List[String] |
val df : DataFrame |
val test_df = df.drop(dropList : _*)
答案 3 :(得分:0)
你可以做,
def dropColumns(inputDF: DataFrame, dropList: List[String]): DataFrame =
dropList.foldLeft(inputDF)((df, col) => df.drop(col))
它将返回DataFrame
,而不会在dropList
中传递列。
作为一个例子(关于幕后发生的事情),让我这样说。
scala> val list = List(0, 1, 2, 3, 4, 5, 6, 7)
list: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7)
scala> val removeThese = List(0, 2, 3)
removeThese: List[Int] = List(0, 2, 3)
scala> removeThese.foldLeft(list)((l, r) => l.filterNot(_ == r))
res2: List[Int] = List(1, 4, 5, 6, 7)
返回的列表(在我们的示例中,将其映射到您的DataFrame)是最新过滤的。每次折叠后,最新值将传递到下一个函数(_, _) => _
。
答案 4 :(得分:0)
您可以使用删除操作删除多个列。如果您需要删除列表中的列名称,则可以在列列表变量之后使用 :_*
传递该名称,它会删除您传递的列表中的所有列。
斯卡拉:
val df = Seq(("One","Two","Three"),("One","Two","Three"),("One","Two","Three")).toDF("Name","Name1","Name2")
val columnstoDrop = List("Name","Name1")
val df1 = df.drop(columnstoDrop:_*)
Python: 在 python 中,你可以使用 * 运算符来做同样的事情。
data = [("One", "Two","Three"), ("One", "Two","Three"), ("One", "Two","Three")]
columns = ["Name","Name1","Name2"]
df = spark.sparkContext.parallelize(data).toDF(columns)
columnstoDrop = ["Name","Name1"]
df1 = df.drop(*columnstoDrop)
现在在 df1 中,您将获得只有一列的数据框,即 Name2。