【问题标题】:Changing a specific column name in pandas DataFrame [duplicate]更改 pandas DataFrame 中的特定列名 [重复]
【发布时间】:2014-01-19 01:00:17
【问题描述】:

我正在寻找一种优雅的方式来更改 DataFrame 中的指定列名。

播放数据...

import pandas as pd
d = {
         'one': [1, 2, 3, 4, 5],
         'two': [9, 8, 7, 6, 5],
         'three': ['a', 'b', 'c', 'd', 'e']
    }
df = pd.DataFrame(d)

迄今为止我发现的最优雅的解决方案...

names = df.columns.tolist()
names[names.index('two')] = 'new_name'
df.columns = names

我希望有一个简单的单线......这次尝试失败了......

df.columns[df.columns.tolist().index('one')] = 'another_name'

感谢您的任何提示。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    确实存在一个班轮:

    In [27]: df=df.rename(columns = {'two':'new_name'})
    
    In [28]: df
    Out[28]: 
      one three  new_name
    0    1     a         9
    1    2     b         8
    2    3     c         7
    3    4     d         6
    4    5     e         5
    

    以下是rename 方法的文档字符串。

    定义:df.rename(self, index=None, columns=None, copy=True, inplace=False) 文档字符串: 使用输入函数更改索引和/或列或 职能。函数/字典值必须是唯一的(一对一)。标签不 包含在 dict / Series 中将保持原样。 参数 ---------- index : 类dict或函数,可选 应用于索引值的转换 列:类似字典或函数,可选 应用于列值的转换 复制:布尔值,默认为 True 同时复制基础数据 就地:布尔值,默认为 False 是否返回一个新的 DataFrame。如果为真,则副本的值为 忽略。 也可以看看 -------- 系列.重命名 退货 -------- 重命名:DataFrame(新对象)

    【讨论】:

    • 这对我不起作用,除非我使用 inplace=True 如@Jeong-Yoon Lee 回复所示。
    【解决方案2】:

    由于inplace参数可用,您不需要将原始数据框复制并分配回自己,而是执行以下操作:

    df.rename(columns={'two':'new_name'}, inplace=True)
    

    【讨论】:

      【解决方案3】:

      怎么样?

      df.columns[2] = "new_name"
      

      【讨论】:

      • 实际上,如果稍后您在 df['new_name'] 等其他操作中使用列名,这将不起作用
      • 这个答案对我将特定列更改为新名称很有用。第一列是索引 0,第二列是索引 1,依此类推。不错的解决方案..我相信这会帮助更多的人..因为其他解决方案需要您事先知道并复制原始列名..虽然这是一种快速而肮脏的方法..它有自己的用途。
      • @MasterYogurt 您的评论不正确。如上所述更改变量后,可以执行df['new_name'](和其他熊猫的东西)。您的评论在最初发布时可能是有效的。
      • 话虽如此,使用rename 方法是更好的解决方案。
      • @JacobH 我仍然遇到 Pandas v1.0.3 的这个问题
      【解决方案4】:

      Pandas 0.21 现在有一个轴参数

      rename 方法获得了一个轴参数以匹配大部分 pandas API 的其余部分。

      所以,除此之外:

      df.rename(columns = {'two':'new_name'})
      

      你可以这样做:

      df.rename({'two':'new_name'}, axis=1)
      

      df.rename({'two':'new_name'}, axis='columns')
      

      【讨论】:

      • df.rename({'two':'new_name'}, axis='columns') 抛出 TypeError: 不能同时指定 'axis' 和任何 'index' 或 'columns'。跨度>
      • @HereHere 确保您使用的是 pandas 0.21 版。请pd.__version__ 检查您的版本
      【解决方案5】:

      这里的列重命名很简单,它适用于Default(0,1,2,etc;) 和现有列,但对于较大的数据集(有很多列)没有多大用处。

      对于更大的数据集,我们可以对需要的列进行切片并应用以下代码:

      df.columns = ['new_name','new_name1','old_name']
      

      【讨论】:

        【解决方案6】:

        以下短代码会有所帮助:

        df3 = df3.rename(columns={c: c.replace(' ', '') for c in df3.columns})
        

        从列中删除空格。

        【讨论】:

        • 我不断收到AttributeError: 'int' object has no attribute 'replace',你能详细说明一下吗?
        【解决方案7】:

        如果您知道它是哪一列(第一个/第二个/第 n 个),那么这个发布在类似问题上的解决方案无论是命名还是未命名都有效,并且在一行中:https://stackoverflow.com/a/26336314/4355695

        df.rename(columns = {list(df)[1]:'new_name'}, inplace=True)
        # 1 is for second column (0,1,2..)
        

        【讨论】:

          【解决方案8】:

          另一种选择是简单地复制并删除该列:

          df = pd.DataFrame(d)
          df['new_name'] = df['two']
          df = df.drop('two', axis=1)
          df.head()
          

          然后你得到结果:

              one three   new_name
          0   1   a       9
          1   2   b       8
          2   3   c       7
          3   4   d       6
          4   5   e       5
          

          【讨论】:

          • 如果列索引的顺序很重要,此方法将无济于事。新列将在最后创建。
          【解决方案9】:

          熊猫版本 0.23.4

          df.rename(index=str,columns={'old_name':'new_name'},inplace=True)
          

          记录在案:

          省略 index=str 将给出错误 replace has an unexpected argument '列'

          【讨论】:

          • 这很好地扩展到一列以上:如果您有 old_namesnew-names 的列表(一对一),那么您可以这样做:df.rename(columns=dict(zip(old_names, new_names)), inplace=True)
          【解决方案10】:

          size = 10
          df.rename(columns={df.columns[i]: someList[i] for i in range(size)}, inplace = True)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-01-10
            • 1970-01-01
            • 2021-12-30
            • 2021-04-24
            • 2018-05-29
            • 2019-11-26
            • 2021-04-19
            • 1970-01-01
            相关资源
            最近更新 更多