我有一个数据框:
| subcategory | subcategory_label | category |
| 00EEE | 00EEE FFF | Drink |
| 0000EEE | 00EEE FFF | Fruit |
| 0EEE | 000EEE FFF | Meat |
从中,我需要从Dataframe的列中删除前导0,并需要这样的结果
| subcategory | subcategory_label | category |
| EEE | EEE FFF | Drink |
| EEE | EEE FFF | Fruit |
| EEE | EEE FFF | Meat |
到目前为止,我可以使用以下命令从一列中删除前导0
df.withColumn("subcategory ", regexp_replace(df("subcategory "), "^0*", "")).show
如何一次性删除数据帧中的前导0?
以此作为提供的数据框:
+-----------+-----------------+--------+
|subcategory|subcategory_label|category|
+-----------+-----------------+--------+
|0000FFFF |0000EE 000FF |ABC |
+-----------+-----------------+--------+
您可以regexp_replace
为所有列创建一个。就像是 :
val regex_all = df.columns.map( c => regexp_replace(col(c), "^0*", "" ).as(c) )
然后使用,select
因为它需要一个类型为varargs的变量Column
:
df.select(regex_all :_* ).show(false)
+-----------+-----------------+--------+
|subcategory|subcategory_label|category|
+-----------+-----------------+--------+
|FFFF |EE 000FF |ABC |
+-----------+-----------------+--------+
编辑:
定义一个函数来返回regexp_replace
d序列很简单:
/**
* @param origCols total cols in the DF, pass `df.columns`
* @param replacedCols `Seq` of columns for which expression is to be generated
* @return `Seq[org.apache.spark.sql.Column]` Spark SQL expression
*/
def createRegexReplaceZeroes(origCols : Seq[String], replacedCols: Seq[String] ) = {
origCols.map{ c =>
if(replacedCols.contains(c)) regexp_replace(col(c), "^0*", "" ).as(c)
else col(c)
}
}
此函数将返回一个 Array[org.apache.spark.sql.Column]
现在,将要替换的列存储在Array中:
val removeZeroes = Array( "subcategory", "subcategory_label" )
并且,然后使用removeZeroes
作为参数调用该函数。这将返回在中regexp_replace
可用列的语句removeZeroes
df.select( createRegexReplaceZeroes(df.columns, removeZeroes) :_* )
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句