在 python 或 Pyspark 数据框中使用特殊字符重命名列
Posted
技术标签:
【中文标题】在 python 或 Pyspark 数据框中使用特殊字符重命名列【英文标题】:Rename columns with special characters in python or Pyspark dataframe 【发布时间】:2017-03-12 21:44:12 【问题描述】:我在 python/pyspark 中有一个数据框。列具有特殊字符,例如点 (.)、空格、括号 (()) 和括号 。以他们的名义。
现在我想重命名列名,如果有点和空格,则用下划线替换它们,如果有 () 和 ,则将它们从列名中删除。
我已经做到了
df1 = df.toDF(*(re.sub(r'[\.\s]+', '_', c) for c in df.columns))
有了这个,我可以用下划线替换点和空格,不能做第二位,即如果 () 和 在那里,只需从列名中删除它们。
我们如何实现这一目标。
【问题讨论】:
替换为空字符串""
。
@Denziloe 我试过这个df1 = mysql.toDF(*(re.sub(r'[\.\s]+ [\()\s]', '_','', c) for c in mysql.columns))
并得到以下错误Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: toDF() argument after * must be a sequence, not generator
【参考方案1】:
如果您有 pyspark 数据框,您可以尝试使用 withColumnRenamed 函数重命名列。我确实尝试过,看看并根据您的更改对其进行自定义。
>>> l=[('some value1','some value2','some value 3'),('some value4','some value5','some value 6')]
>>> l_schema = StructType([StructField("col1.some valwith(in)andaround",StringType(),True),StructField("col2.some valwith()and",StringType(),True),StructField("col3 some()valwith.and",StringType(),True)])
>>> reps=('.','_'),(' ','_'),('(',''),(')',''),('','')('','')
>>> rdd = sc.parallelize(l)
>>> df = sqlContext.createDataFrame(rdd,l_schema)
>>> df.printSchema()
root
|-- col1.some valwith(in)andaround: string (nullable = true)
|-- col2.some valwith()and: string (nullable = true)
|-- col3 some()valwith.and: string (nullable = true)
>>> df.show()
+------------------------+------------------------+------------------------+
|col1.some valwith(in)andaround|col2.some valwith()and|col3 some()valwith.and|
+------------------------+------------------------+------------------------+
| some value1| some value2| some value 3|
| some value4| some value5| some value 6|
+------------------------+------------------------+------------------------+
>>> def colrename(x):
... return reduce(lambda a,kv : a.replace(*kv),reps,x)
>>> for i in df.schema.names:
... df = df.withColumnRenamed(i,colrename(i))
>>> df.printSchema()
root
|-- col1_some_valwithinandaround: string (nullable = true)
|-- col2_some_valwithand: string (nullable = true)
|-- col3_somevalwith_and: string (nullable = true)
>>> df.show()
+--------------------+--------------------+--------------------+
|col1_some_valwithinandaround|col2_some_valwithand|col3_somevalwith_and|
+--------------------+--------------------+--------------------+
| some value1| some value2| some value 3|
| some value4| some value5| some value 6|
+--------------------+--------------------+--------------------+
【讨论】:
一列就是这样 col1.some.valwith 和 val(abc)。我们怎样才能得到 col1_some_valwithand_valabc 我们用下划线替换了空格,比如我想使用 hive 支持的特殊字符来代替空格。我们怎样才能做到这一点 更改代表的映射。【参考方案2】:Python 3.x 解决方案:
tran_tab = str.maketrans(x:None for x in list('()'))
df1 = df.toDF(*(re.sub(r'[\.\s]+', '_', c).translate(tran_tab) for c in df.columns))
Python 2.x 解决方案:
df1 = df.toDF(*(re.sub(r'[\.\s]+', '_', c).translate(None, '()') for c in df.columns))
【讨论】:
我在 pyspark 中收到此错误 >>> tran_tab = str.maketrans(x:None for x in list('()')) Traceback(最近一次调用最后一次):以上是关于在 python 或 Pyspark 数据框中使用特殊字符重命名列的主要内容,如果未能解决你的问题,请参考以下文章
提取特定单元格的值并将其填充以代替 pyspark 数据框中的 NA 值
如何删除列之间的重复值,而不管它们在 python 或 pyspark 中的顺序如何?