题 重命名pandas中的列


我有一个使用pandas和列标签的DataFrame,我需要编辑它来替换原始列标签。

我想更改DataFrame中的列名称 A 原始列名称是:

['$a', '$b', '$c', '$d', '$e'] 

['a', 'b', 'c', 'd', 'e'].

我将已编辑的列名存储在列表中,但我不知道如何替换列名。


1089
2017-07-05 14:21


起源


对于那些在2017年以来即将获得此答案的人。 Pandas现在的版本为0.21,并更新了一些重命名列的方法。请参阅以下答案: stackoverflow.com/a/46912050/3707607 - Ted Petrou
对于那些在2018年即将到来的人来说。 Pandas现在的版本为0.22,并且仍然只添加了功能 .rename与此问题无关的方法。以下所有答案仍然有效。 - firelynx


答案:


只需将其分配给 .columns 属性:

>>> df = pd.DataFrame({'$a':[1,2], '$b': [10,20]})
>>> df.columns = ['a', 'b']
>>> df
   a   b
0  1  10
1  2  20

1129
2017-07-05 14:23



是否可以更改单个列标题名称? - ericmjl
@ericmjl:假设您要更改df的第一个变量的名称。然后你可以这样做: new_columns = df.columns.values;   new_columns[0] = 'XX';  df.columns = new_columns - cd98
看起来你可以简单地完成df.columns.values [0] ='XX' - RAY
开个玩笑,@ RAY - 不要这样做。看起来这是一个独立于任何索引存储列名称而生成的列表。破坏你的df的列命名是一个不错的工作...... - Mitch Flax
@ericmjl是的 df.rename(columns = {'$b':'B'}, inplace = True) - nachocab


使用 df.rename() 函数并引用要重命名的列。并非所有列都必须重命名:

df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
# Or rename the existing DataFrame (rather than creating a copy) 
df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'}, inplace=True)

1871
2017-07-06 01:48



当我使用6列数据框(dataframe <按enter>)时,缩写表示:code <class'pandas.core.frame.DataFrame'> Int64Index:1000个条目,0到999个数据列:BodyMarkdown 1000非null code 工作,但当我执行dataframe.head()时,列的旧名称重新出现。 - darKoram
我害怕 SettingWithCopyWarning: 当我在这个答案中使用第二个代码片段时。 - Monica Heddneck
是否有正规更换的版本? - denfromufa
哦,我找到了 - 下面的答案! stackoverflow.com/a/16667215/2230844 - denfromufa
第一个解决方案: df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'}) 更改显示的名称,但是 不 底层数据结构中的元素。所以,如果你尝试 df['newName1'] 你会收到一个错误。该 inplace=True 有必要避免那个gotchya。 - irritable_phd_syndrom


rename 方法可以采取一个函数,例如:

In [11]: df.columns
Out[11]: Index([u'$a', u'$b', u'$c', u'$d', u'$e'], dtype=object)

In [12]: df.rename(columns=lambda x: x[1:], inplace=True)

In [13]: df.columns
Out[13]: Index([u'a', u'b', u'c', u'd', u'e'], dtype=object)

295
2018-05-21 09:58



尼斯。这个节省了我的一天: df.rename(columns=lambda x: x.lstrip(), inplace=True) - root-11
与@ root-11类似 - 在我的情况下,有一个子弹点字符没有在IPython控制台输出中打印,所以我需要删除的不仅仅是空格(条带),所以: t.columns = t.columns.str.replace(r'[^\x00-\x7F]+','') - The Red Pea
df.rename(columns=lambda x: x.replace(' ', '_'), inplace=True) 是一个宝石,所以我们可以写 df.Column_1_Name 而不是写作df.loc[:, 'Column 1 Name'] 。 - josh


如记录在案 http://pandas.pydata.org/pandas-docs/stable/text.html

df.columns = df.columns.str.replace('$','')

121
2018-05-30 13:24





由于您只想删除所有列名中的$符号,您可以这样做:

df = df.rename(columns=lambda x: x.replace('$', ''))

要么

df.rename(columns=lambda x: x.replace('$', ''), inplace=True)

116
2018-03-26 10:20





熊猫0.21+答案

版本0.21中的列重命名有一些重要更新。

  • rename 方法 添加了 axis 参数可以设置为 columns 要么 1。此更新使此方法与其余的pandas API匹配。它还有 index 和 columns 参数,但你不再被迫使用它们。
  • set_axis 方法 随着 inplace 设置 False 使您可以使用列表重命名所有索引或列标签。

Pandas 0.21+的例子

构造示例DataFrame:

df = pd.DataFrame({'$a':[1,2], '$b': [3,4], 
                   '$c':[5,6], '$d':[7,8], 
                   '$e':[9,10]})

   $a  $b  $c  $d  $e
0   1   3   5   7   9
1   2   4   6   8  10

运用 rename 同 axis='columns' 要么 axis=1

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis='columns')

要么

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis=1)

两者都导致以下结果:

   a  b  c  d   e
0  1  3  5  7   9
1  2  4  6  8  10

仍然可以使用旧方法签名:

df.rename(columns={'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'})

rename 函数还接受将应用于每个列名称的函数。

df.rename(lambda x: x[1:], axis='columns')

要么

df.rename(lambda x: x[1:], axis=1)

运用 set_axis 列表和 inplace=False

你可以提供一个清单 set_axis 长度与列数(或索引)相等的方法。目前, inplace 默认为 True但是 inplace 将默认为 False 在未来的版本中。

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis='columns', inplace=False)

要么

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis=1, inplace=False)

为什么不用 df.columns = ['a', 'b', 'c', 'd', 'e']

像这样直接分配列没有任何问题。这是一个非常好的解决方案。

使用的好处 set_axis 是它可以用作方法链的一部分,并返回DataFrame的新副本。没有它,您必须在重新分配列之前将链的中间步骤存储到另一个变量。

# new for pandas 0.21+
df.some_method1()
  .some_method2()
  .set_axis()
  .some_method3()

# old way
df1 = df.some_method1()
        .some_method2()
df1.columns = columns
df1.some_method3()

92
2017-10-24 13:39



谢谢你的 Pandas 0.21+ answer  - 不知何故,我错过了“什么是新的”部分...... - MaxU
该解决方案似乎不适用于Pandas 3.6:df.rename({'$ a':'a','$ b':'b','$ c':'c','$ d':'d ','$ e':'e'},axis ='columns')。获取意外的关键字参数“axis” - Arthur D. Howland
df.columns = ['a','b','c','d','e']似乎不再起作用,使用版本0.22我有一个警告说 Pandas不允许通过新的属性名称创建列 。如果我的所有列都被调用,如何重命名:/ - Nabla


df.columns = ['a', 'b', 'c', 'd', 'e']

它将按您提供的顺序用您提供的名称替换现有名称。

您也可以通过索引分配它们,如下所示:

df.columns.values[2] = 'c'    #renames the 2nd column to 'c' (in position #3)

67
2018-03-22 08:59



不要修改 df.columns.values那是错的。 stackoverflow.com/questions/43291781/... - liliscent


old_names = ['$a', '$b', '$c', '$d', '$e'] 
new_names = ['a', 'b', 'c', 'd', 'e']
df.rename(columns=dict(zip(old_names, new_names)), inplace=True)

这样你就可以手动编辑了 new_names 如你所愿。 当您只需要重命名几列以纠正错误拼写,重音,删除特殊字符等时,效果很好。


53
2018-05-21 17:48



我喜欢这种方法,但我认为 df.columns = ['a', 'b', 'c', 'd', 'e'] 更简单。 - Christopher Pearson
我喜欢这种压缩旧名和新名的方法。我们可以用 df.columns.values 得到旧名字。 - bkowshik
我显示表格视图并将列复制到old_names。我将需求数组复制到new_names。然后使用dict(zip(old_names,new_names))非常优雅的解决方案。 - mythicalcoder
我经常使用以下内容的列表子集: myList = list(df) myList[10:20] 等等 - 所以这是完美的。 - Tim Gottgetreu


我认为这种方法很有用:

df.rename(columns={"old_column_name1":"new_column_name1", "old_column_name2":"new_column_name2"})

此方法允许您单独更改列名称。


31
2018-03-17 09:13