重命名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
方法添加了可能被设置为columns
或1
的axis
参数。 此更新使得此方法与pandasAPI的其余部分相匹配。 它仍然有index
和columns
参数,但你不再被迫使用它们。 - 将
set_index
设置为False
的set_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()