替换数据框中的重复列

2024-04-20

我有一个data frame in pyspark。该数据框有一些带有特殊字符的列。

cols = df.schema.names

cols
['abc test', 'test*abc', 'eng)test', 'abc_&test']

reps = ((' ', '_&'), ('(', '*_'), (')', '_*'), ('{', '#_'), ('}', '_#'), (';', '_##'), ('.', '_$'), (',', '_$$'), ('=', '_**'))

def col_rename(x):
    new_cols = reduce(lambda a, kv: a.replace(*kv), reps, x)

for i in cols:
    df = df.withColumnRenamed(i, col_rename(cols, i))
return df

现在我想看看替换列名称中的特殊字符后是否存在重复的列。 正如我们所看到的,new_cols 中有重复的列abc_&test

我想额外退回_ underscore当这个情况发生时。

我的 new_cols 应该如下所示

['abc__&test', 'test*_abc', 'eng_*test', 'abc_&test']

我怎样才能实现我想要的?


首先你需要更改列名称定义如下

reps = [(' ', '_&'), ('(', '*_'), (')', '_*'), ('{', '#_'), ('}', '_#'), (';', '_##'), ('.', '_$'), (',', '_$$'), ('=', '_**')]

这可以通过创建一个新列表

replacedCols = []
for col in cols:
    for x in reps:
        col = col.replace(x[0], x[1])
    replacedCols.append(col)

现在我想看看替换列名称中的特殊字符后是否存在重复的列。发生这种情况时我想返回额外的 _ 下划线。

你可以这样做检查中的每个列名称replacedCols array

checkCols = replacedCols[:]
for index, col in enumerate(replacedCols):
    checkCols[index] = ''
    replacedCols[index]
    if col in checkCols:
        replacedCols[index] = col.replace('_', '__')

这样你就完成了。最后一步是rename

for index, col in enumerate(cols):
    df = df.withColumnRenamed(col, replacedCols[index])

df.show(truncate=False)

你应该有

+----------+--------+---------+---------+
|abc__&test|test*abc|eng_*test|abc_&test|
+----------+--------+---------+---------+

我希望这有帮助。快乐编码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

替换数据框中的重复列 的相关文章

随机推荐