重命名pandas数据框中的单个列标题

我有一个数据框称为data 。 我将如何重命名唯一的一个列标题? 例如gdp log(gdp)

 data = y gdp cap 0 1 2 5 1 2 3 9 2 8 7 2 3 3 4 7 4 6 7 7 5 4 8 3 6 8 2 8 7 9 9 10 8 6 6 4 9 10 10 7 

 data.rename(columns={'gdp':'log(gdp)'}, inplace=True) 

rename表明它接受一个字典作为columns的参数,所以你只需要通过一个字典的单词。

另见相关

如果您需要重新命名单个列,更快的实现将是使用list-comprehension

 df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns] 

如果需要重命名多个列,请使用以下条件expression式:

 df.columns = ['log(gdp)' if x=='gdp' else 'cap_mod' if x=='cap' else x for x in df.columns] 

或者,使用dictionary构造一个映射,并通过将其默认值设置为旧名称来get操作来执行list-comprehension

 col_dict = {'gdp': 'log(gdp)', 'cap': 'cap_mod'} ## key→old name, value→new name df.columns = [col_dict.get(x, x) for x in df.columns] 

时序:

 %%timeit df.rename(columns={'gdp':'log(gdp)'}, inplace=True) 10000 loops, best of 3: 168 µs per loop %%timeit df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns] 10000 loops, best of 3: 58.5 µs per loop 

你可以调用df.columns.str.replace

 df.columns = df.columns.str.replace('gdp', 'log(gdp)') df y log(gdp) cap 0 1 2 5 1 2 3 9 2 8 7 2 3 3 4 7 4 6 7 7 5 4 8 3 6 8 2 8 7 9 9 10 8 6 6 4 9 10 10 7 

这与其他方法的优点是,您也可以执行基于正则expression式的replace:

 df x1 y1 y2 0 1 2 5 1 2 3 9 2 8 7 2 3 3 4 7 4 6 7 7 5 4 8 3 6 8 2 8 7 9 9 10 8 6 6 4 9 10 10 7 df.columns = df.columns.str.replace(r'y(\d+)$', r'zzzz\1') df x1 zzzz1 zzzz2 0 1 2 5 1 2 3 9 2 8 7 2 3 3 4 7 4 6 7 7 5 4 8 3 6 8 2 8 7 9 9 10 8 6 6 4 9 10 10 7 

pandas0.21+答案

在0.21版本中对列重命名进行了一些重大更新。

  • rename方法添加了可能被设置为columns1axis参数。 此更新使得此方法与pandasAPI的其余部分相匹配。 它仍然有indexcolumns参数,但你不再被迫使用它们。
  • set_index设置为Falseset_index方法使您可以使用列表重命名所有索引或列标签。

pandas0.21+的例子

构build示例DataFrame:

 df = pd.DataFrame({'y':[1,2,8], 'gdp':[2,3,7], 'cap':[5,9,2]}, columns=['y','gdp', 'cap']) cap gdp y 0 5 2 1 1 9 3 2 2 2 7 8 

使用axis='columns'axis=1 rename (new为0.21)

 df.rename({'gdp':'log(gdp)'}, axis='columns') 

要么

 df.rename({'gdp':'log(gdp)'}, axis=1) 

两者的结果如下:

  cap log(gdp) y 0 5 2 1 1 9 3 2 2 2 7 8 

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

 df.rename(columns={'gdp':'log(gdp)'}) 

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

 df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis='columns') 

要么

 df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1) 

使用set_axis与列表和set_axis inplace=False

您可以向set_axis方法提供一个长度等于列数(或索引)的列表。 目前, inplace默认为True ,但在将来的版本中, inplace将被默认为False

 df.set_axis(['cap', 'log(gdp)', 'y'], axis='columns', inplace=False) 

要么

 df.set_axis(['cap', 'log(gdp)', 'y'], axis=1, inplace=False) 

为什么不使用df.columns = ['cap', 'log(gdp)', 'y']

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

使用set_axis的优点是它可以用作方法链的一部分,并返回DataFrame的新副本。 没有它,你将不得不将链的中间步骤存储到另一个variables,然后重新分配列。

 # 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()