【问题标题】:How to add a suffix (or prefix) to each column name?如何为每个列名添加后缀(或前缀)?
【发布时间】:2016-03-07 02:24:20
【问题描述】:

我想为每个列名添加_x 后缀,如下所示:

featuresA = myPandasDataFrame.columns.values + '_x'

我该怎么做?另外,如果我想添加x_ 作为后缀,解决方案将如何变化?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我认为这是我经常使用的,例如:

    df = pd.DataFrame({'silverfish': range(3), 'silverspoon': range(4, 7),
                       'goldfish': range(10, 13),'goldilocks':range(17,20)})
    
    

    我的动态重命名方式:

    color_list = ['gold','silver']
    
    for i in color_list:
        df[f'color_{i}']=df.filter(like=i).sum(axis=1)
    

    输出:

    {'silverfish': {0: 0, 1: 1, 2: 2},
     'silverspoon': {0: 4, 1: 5, 2: 6},
     'goldfish': {0: 10, 1: 11, 2: 12},
     'goldilocks': {0: 17, 1: 18, 2: 19},
     'color_gold': {0: 135, 1: 145, 2: 155},
     'color_silver': {0: 20, 1: 30, 2: 40}}
    

    【讨论】:

      【解决方案2】:

      使用DataFrame.rename

      df = pd.DataFrame({'A': range(3), 'B': range(4, 7)})
      print(df)
         A  B
      0  0  4
      1  1  5
      2  2  6
      

      renameaxis=1 和字符串格式一起使用:

      df.rename('col_{}'.format, axis=1)
      # or df.rename(columns='col_{}'.format)
      
         col_A  col_B
      0      0      4
      1      1      5
      2      2      6
      

      要真正覆盖您的列名,我们可以将返回的值分配给我们的df

      df = df.rename('col_{}'.format, axis=1)
      

      或使用inplace=True:

      df.rename('col_{}'.format, axis=1, inplace=True)
      

      【讨论】:

      • 迄今为止最好的答案。它不会创建新对象,它允许您使用映射器随意格式化字符串。并且没有额外的代码行(单行是我的弱点)
      【解决方案3】:

      我知道在列名称中添加后缀(或前缀)的 4 种方法:

      1-df.columns = [str(col) + '_some_suffix' for col in df.columns]

      2-df.rename(columns= lambda col: col+'_some_suffix')

      3- df.columns += '_some_suffix' 很容易。

      或者,最好的:

      3-df.add_suffix('_some_suffix')

      【讨论】:

        【解决方案4】:

        我还没有看到上面提出的这个解决方案,所以将它添加到列表中:

        df.columns += '_x'
        

        而且您可以轻松适应前缀场景。

        【讨论】:

        • 后缀的最佳解决方案,当然它不能用于前缀。
        • 仅适用于列名中的常规数据类型,而不是如果您的列是 RangeIndex,例如 df = pd.DataFrame([[1,2,3]]*10) --> df.columns,那么您将使用 df.add_suffix('_x')
        【解决方案5】:

        您可以使用list 理解:

        df.columns = [str(col) + '_x' for col in df.columns]
        

        还有另一个答案中提到的.add_suffix().add_prefix() 等内置方法。

        【讨论】:

        • 这是最简单优雅的答案!
        【解决方案6】:

        优雅的就地串联

        如果您尝试就地修改df,那么最便宜(也是最简单)的选项是直接在df.columns 上就地添加(即使用Index.__iadd__)。

        df = pd.DataFrame({"A": [9, 4, 2, 1], "B": [12, 7, 5, 4]})
        df
        
           A   B
        0  9  12
        1  4   7
        2  2   5
        3  1   4
        

        df.columns += '_some_suffix'
        df
        
           A_some_suffix  B_some_suffix
        0              9             12
        1              4              7
        2              2              5
        3              1              4
        

        要添加前缀,您可以类似地使用

        df.columns = 'some_prefix_' + df.columns
        df
        
           some_prefix_A  some_prefix_B
        0              9             12
        1              4              7
        2              2              5
        3              1              4
        

        另一个便宜的选择是使用带有f-string 格式的列表推导(在python3.6+ 上可用)。

        df.columns = [f'{c}_some_suffix' for c in df]
        df
        
           A_some_suffix  B_some_suffix
        0              9             12
        1              4              7
        2              2              5
        3              1              4
        

        对于前缀,类似地,

        df.columns = [f'some_prefix{c}' for c in df]
        

        方法链

        还可以在方法链接时添加 *fixes。要添加后缀,请使用DataFrame.add_suffix

        df.add_suffix('_some_suffix')
        
           A_some_suffix  B_some_suffix
        0              9             12
        1              4              7
        2              2              5
        3              1              4
        

        这将返回数据的副本。 IOW,df 未修改。

        添加前缀也可以使用DataFrame.add_prefix

        df.add_prefix('some_prefix_')
        
           some_prefix_A  some_prefix_B
        0              9             12
        1              4              7
        2              2              5
        3              1              4
        

        这也不会修改df


        批评add_*fix

        如果您尝试执行方法链接,这些是很好的方法:

        df.some_method1().some_method2().add_*fix(...)
        

        然而,add_prefix(和add_suffix)创建了整个数据框的副本,只是为了修改标题。如果你认为这很浪费,但仍想上链,可以拨打pipe

        def add_suffix(df):
            df.columns += '_some_suffix'
            return df
        
        df.some_method1().some_method2().pipe(add_suffix)
        

        【讨论】:

        • 这很优雅!如果您想为列的子集添加前缀或后缀怎么办,例如名称都包含一个常用词(如newold)而不是每一列的列?谢谢。
        • @BowenLiu 我建议使用 df.rename() 代替...将字典映射名称传递给他们的新名称。然后使用axis = 1调用重命名。您还可以使用条件列表理解赋值。
        • 仅适用于常规数据类型作为列名,而不是如果您的列是 RangeIndex,例如 df = pd.DataFrame([[1,2,3]]*10) --> df.columns,那么您将使用 df.add_suffix('_x')
        • 你可以按照我的第一种方法显示df.columns = df.columns.astype(str) + '_x'
        【解决方案7】:

        以下是我认为最好的添加后缀的方法。

        df = df.add_suffix('_some_suffix')
        

        因为它是在 DataFrame 上调用并返回 DataFrame 的函数 - 您可以在调用链中使用它。

        【讨论】:

        • 如果要为名称添加前缀,可以使用 add_prefix。
        • 太糟糕了,这不能是可变的(即没有 inplace=True 参数选项)。否则,完美。
        • 我认为这在某些情况下比公认的答案更好,因为它可以在单个语句中用于一系列操作,而不需要自己的语句。
        • @CaptainLepton 当不会这个答案比接受的答案更好
        • 如果后缀不是常数。标题谈论后缀。帖子将范围缩小到单个常量后缀,但如果我们笼统地回答帖子标题,那么通过列表理解或其他可迭代设置列会更灵活
        猜你喜欢
        • 1970-01-01
        • 2015-12-05
        • 2013-01-30
        • 2018-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多