在pandas DataFrame中更改特定的列名称


195

我一直在寻找一种优雅的方法来更改中的指定列名称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'

非常感谢收到的任何提示。

Answers:


355

确实存在一个班轮:

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)
Docstring:
使用输入功能更改索引和/或列或
功能。函数/字典值必须唯一(1对1)。标签不行
dict / Series中包含的内容将保持不变。

参量
----------
index:类似dict或函数,可选
    转换以应用于索引值
列:类似字典或函数,可选
    转换以应用于列值
复制:布尔值,默认为True
    同时复制基础数据
inplace:布尔值,默认为False
    是否返回新的DataFrame。如果为True,则复制值为
    忽略了。

也可以看看
--------
Series.rename

退货
-------
重命名为:DataFrame(新对象)

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

108

由于inplaceargument是可用的,因此您无需复制原始数据帧并将其分配回自身,而是执行以下操作:

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

39

关于什么?

df.columns.values[2] = "new_name"

11
实际上,如果稍后您在其他操作(例如df ['new_name'])中使用列名,这是行不通的
Master Yogurt

4
此答案对我将特定列更改为新名称很有用。第一列为索引0,第二列为索引1,依此类推。不错的解决方案..我相信这会帮助更多的人..其他解决方案需要您事先知道并复制原始列名.....这是一种快速而又肮脏的方法..它有自己的用途。
ihightower

1
@MasterYogurt您的评论不正确。df['new_name']如上所述更改变量后,可以执行(和其他熊猫操作)。您的评论最初发布时可能已经有效。
雅各布·H

1
话虽如此,使用这些rename方法是更好的解决方案。
雅各布·H

6

熊猫0.21现在具有轴参数

重命名方法已获得一个axis参数,以匹配其余大多数熊猫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'中的任何一个。
'17

@HereHere确保您使用的是熊猫0.21版。做pd.__version__检查您的版本
Ted Petrou


3

要重命名列,这里是一种简单的方法,它既Default(0,1,2,etc;)适用于现有的列,也适用于现有的列,但对于较大的数据集(具有许多列)而言,用处不大。

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

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


2

熊猫0.23.4版

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

作为记录:

省略index = str将给出错误替换,带有意外参数'columns'


1

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

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.