从数据框列名称中删除句点 (.)
Posted
技术标签:
【中文标题】从数据框列名称中删除句点 (.)【英文标题】:Remove Period (.) from Dataframe Column Names 【发布时间】:2020-07-09 15:45:36 【问题描述】:所以我已经浏览了这里所有关于替换列名中的特殊字符的示例,但我似乎无法让它在一段时间内工作。
我尝试过的:
# works to remove spaces
df.select([F.col(c).alias(c.replace(' ', '_')) for c in df.columns])
# doesn't work to remove periods
df.select([F.col(c).alias(c.replace('.', '')) for c in df.columns])
# removes special characters except periods
df.select([F.col(col).alias(re.sub("[^0-9a-zA-Z$]+","",col)) for col in df.columns])
我知道如何通过引用特定列来更改列的名称,但这需要更改具有特殊字符列的任何数据框的列名称
具体来说,这是给我带来麻烦的列名:“Src. of Business Contact Full Name”
【问题讨论】:
它是一个 reg expr 所以句号需要用 \ 转义吗? 请多解释一下 不走运 你收到org.apache.spark.sql.AnalysisException
错误?
AnalysisException: 无法解析 'Src. of Business Contact Full Name
' 给定的输入列
【参考方案1】:
select()
是一种已弃用的方法。为什么不像下面这样简单呢?
import re
df = pd.DataFrame(["a biz"], columns=["Src.$ of-Business Contact` Full Name"])
df.columns = [re.sub("[ ,-]", "_", re.sub("[\.,`,\$]", "", c)) for c in df.columns]
df
输出
Src_of_Business_Contact_Full_Name
0 a biz
【讨论】:
然而,另一个非常好的解决方案,有没有办法让它捕获所有特殊字符? 只是扩展 reg expr。如果需要,df.columns = [re.sub("[ ,\$]", "_", re.sub("[.]", "", c)) for c in df.columns]
会将 $ 替换为下划线
@PalaniThangaraj 我更新了示例以展示如何处理更多特殊字符【参考方案2】:
尝试使用反引号转义列名`col_name`
.
df=spark.createDataFrame([('1','2')],['header','pla.nned'])
df.columns
#['header', 'pla.nned']
from pyspark.sql import functions as F
df.select([F.col("`0`".format(c)).alias(c.replace('.', '')) for c in df.columns]).show()
#+------+-------+
#|header|planned|
#+------+-------+
#| 1| 2|
#+------+-------+
【讨论】:
【参考方案3】:使用 reduce
和 withColumnRenamed
的另一种方法。
from functools import reduce
(reduce(lambda new_df, col: new_df.withColumnRenamed(col,col.replace('.','')),df.columns,df)).show()
【讨论】:
以上是关于从数据框列名称中删除句点 (.)的主要内容,如果未能解决你的问题,请参考以下文章