【问题标题】:How to add suffix and prefix to all columns in python/pyspark dataframe如何为 python/pyspark 数据框中的所有列添加后缀和前缀
【发布时间】:2017-08-26 20:55:33
【问题描述】:

我在 pyspark 中有一个超过 100 列的数据框。我想要做的是所有列名,我想在列名的开头和列名的结尾添加反勾号(`)。

例如:

column name  is testing user. I want `testing user`

在 pyspark/python.当我们应用代码时,它应该返回一个数据框。

【问题讨论】:

    标签: python apache-spark pyspark spark-dataframe


    【解决方案1】:

    在 python 中使用列表推导。

    from pyspark.sql import functions as F
    
    df = ...
    
    df_new = df.select([F.col(c).alias("`"+c+"`") for c in df.columns])
    

    此方法还为您提供了在 alias() 函数中添加自定义 Python 逻辑的选项,例如:"prefix_"+c+"_suffix" if c in list_of_cols_to_change else c

    【讨论】:

      【解决方案2】:

      你可以使用withColumnRenameddataframe的方法结合na创建新的dataframe

      df.na.withColumnRenamed('testing user', '`testing user`')
      

      编辑:假设您有列列表,您可以这样做 -

      old = "First Last Age"
      new = ["`"+field+"`" for field in old.split()]
      df.rdd.toDF(new)
      

      输出:

      DataFrame[`First`: string, `Last`: string, `Age`: string]
      

      【讨论】:

      • 更新了我的答案
      • 如果你只是想将数据从mysql导出到hive,你最好只使用sqoop,除非你对数据进行任何专门的处理,你不必通过spark。
      【解决方案3】:

      如果您想为 pyspark 数据框中的多列添加前缀或后缀,可以使用 for 循环和 .withColumnRenamed()。

      例如,您可能会喜欢:

      def add_prefix(sdf, prefix):
      
            for c in sdf.columns:
      
                sdf = sdf.withColumnRenamed(c, '{}{}'.format(prefix, c))
      
            return sdf
      

      您可以根据需要修改 sdf.columns。

      【讨论】:

        【解决方案4】:

        添加前缀或后缀:

        1. 请参阅 df.columns 以获取列列表 ([col_1, col_2...])。这是我们要为列添加后缀/前缀的数据框。
        df.columns
        
        1. 迭代上面的列表并创建另一个具有别名的列列表,可以在选择表达式中使用。
        from pyspark.sql.functions import col
        
        select_list = [col(col_name).alias("prefix_" + col_name)  for col_name in df.columns]
        
        1. 使用内部选择时,不要忘记解包 带有星号(*) 的列表。我们可以将其分配回相同或不同的 df 以供使用。
        df.select(*select_list).show()
        df = df.select(*select_list)
        

        df.columns 现在将返回新列的列表(别名)。

        【讨论】:

        • 感谢您的步骤分解。将df.selectpyspark.sql.functions col-method 结合使用是一种可靠的方法,因为它维护了应用的映射/别名,因此在重命名操作后维护了顺序/模式。以下是示例select_list 内容:[Column<b'XYZ AS prefix_XYZ'>, Column<b'ABC_ID AS prefix_ABC_ID'>]
        【解决方案5】:

        我有一个数据框,我复制了两次然后合并在一起。由于两者都有相同的列名,我使用:

        df = reduce(lambda df, idx: df.withColumnRenamed(list(df.schema.names)[idx],
                                                         list(df.schema.names)[idx] + '_prec'),
                    range(len(list(df.schema.names))),
                    df)
        

        然后,我的数据框中的每一列都有“_prec”后缀,这让我可以做一些甜蜜的事情

        【讨论】:

        • 您能否更详细地解释一下这是如何回答这个问题的?
        • 提出的问题是如何为数据框的所有列添加后缀或前缀。这里我添加了一个后缀,但你可以通过简单地更改withColumnRenamed 的第二个参数来实现。在这个人的情况下,它将是"'" + list(df.schema.names)[idx] + "'")
        猜你喜欢
        • 2013-02-04
        • 1970-01-01
        • 1970-01-01
        • 2018-11-01
        • 2016-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多