在pandas DataFrame中更改特定列名称

252

我正在寻找一种优雅的方法来更改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'
任何提示都将不胜感激。
10个回答

451

确实存在一种单行表达式:

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)
文档字符串:
使用输入函数或函数来更改索引和/或列。函数/字典值必须是唯一的(1对1)。不包含在字典/ Series 中的标签将保持原样。
参数 ---------- index:类似字典或函数,可选 要应用于索引值的转换 columns:类似字典或函数,可选 要应用于列值的转换 copy:布尔值,默认为True 同时复制基础数据 inplace:布尔值,默认为False 是否返回新的DataFrame。如果为True,则忽略copy的值。
另请参见 -------- Series.rename 返回值 ------- renamed:DataFrame(新对象)

除非我使用@Jeong-Yoon Lee回复中所示的inplace=True,否则这对我不起作用。 - JStrahl

133

由于 inplace 参数可用,您不需要将原始数据框复制并重新分配给自身,而应按照以下方式操作:

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

51

怎么样?

df.columns[2] = "new_name"

15
实际上,如果您稍后在其他操作中使用列名称,例如在df ['new_name']中,则该方法不起作用。 - Master Yogurt
4
这个回答对我来说很有用,它帮助我将一个特定的列更改为新名称。第一列是索引0,第二列是索引1,依此类推。这是一个好的解决方案,我相信它会帮助更多的人。因为其他解决方案需要事先知道和复制原始列名... 而这个方法虽然快速且简单,但它也有其自身的用途。 - ihightower
2
@MasterYogurt,您的评论是不正确的。按照上述方法更改变量后,仍然可以执行df['new_name'](以及其他pandas操作)。当您最初发布评论时,您的评论可能是正确的。 - Jacob H
1
话虽如此,使用“rename”方法是更好的解决方案。 - Jacob H
@JacobH 我仍然在使用Pandas v1.0.3时遇到此问题。 - Philipp

17

如果您知道它是第几列(第一列/第二列/第n列),那么这个类似问题发布的解决方案将可以适用于无论其是否命名,并且只需一行代码: https://dev59.com/jl8d5IYBdhLWcg3w41cp#26336314

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

只有在列名中没有"nan"的情况下才能正常工作,否则它将改变所有列名。 - Hackerman
1
我唯一的解决方案是将一个列表的列表转换成了具有0、1、..250列的数据框,而我只需要给前三列“命名”。这个方法完美地起作用了。 - KayCee

11

Pandas 0.21现在具有axis参数

rename方法增加了一个axis参数,以匹配大多数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
@HereHere 确保你使用的是 pandas 0.21 版本。请执行 pd.__version__ 命令来检查你的版本。 - Ted Petrou

4

对于重命名列,以下方法适用于默认列(0、1、2等)和现有列,但不适用于具有多个列的大型数据集。

对于具有许多列的大型数据集,我们可以切片所需的列并应用以下代码:

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

4

pandas版本0.23.4

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

记录一下:

省略index=str会导致错误,replace函数有一个意外的参数'columns'


1
这个方法可以很好地扩展到多列:如果你有一个old_namesnew_names的列表(一一对应),那么你可以这样做:df.rename(columns=dict(zip(old_names, new_names)), inplace=True) - Colin

3
以下简短的代码可以帮助您:

以下是简短的代码:

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

删除列中的空格。


我一直收到 AttributeError: 'int' object has no attribute 'replace' 的错误,你能详细解释一下吗? - Nirmal

2
另一种选择是简单地复制并粘贴该列:

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

2
这种方法在列索引的顺序很重要的情况下是无效的。新列将被创建在末尾。 - Loochie

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接