重命名pandas中的特定列

时间:2013-11-03 21:28:49

标签: python pandas dataframe rename

我有一个名为data的数据框。如何重命名唯一的一个列标题?例如gdplog(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

5 个答案:

答案 0 :(得分:265)

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

rename表示它接受dict作为columns的参数,因此您只需传递带有单个条目的dict。

另见related

答案 1 :(得分:18)

如果您需要重命名单个列,更快的实施方法是使用list-comprehension

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

如果需要重命名多个列,请使用条件表达式,如:

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

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

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

答案 2 :(得分:7)

  

如何重命名pandas中的特定列?

从v0.24 +,一次重命名一个(或多个)列,

如果您需要一次重命名所有列,

    使用v0.21
  • DataFrame.set_axis() 方法。传递类似列表的序列。选项也可用于就地修改。
带有axis=1

rename
axis=1

使用0.21 +,您现在可以使用df = pd.DataFrame('x', columns=['y', 'gdp', 'cap'], index=range(5)) df y gdp cap 0 x x x 1 x x x 2 x x x 3 x x x 4 x x x 指定axis参数:

rename

(请注意,df.rename({'gdp':'log(gdp)'}, axis=1) # df.rename({'gdp':'log(gdp)'}, axis='columns') y log(gdp) cap 0 x x x 1 x x x 2 x x x 3 x x x 4 x x x 默认不在原地,因此您需要重新分配结果。)

此添加旨在提高与API其余部分的一致性。新的rename参数类似于axis参数 - 它们做同样的事情。

columns

df.rename(columns={'gdp': 'log(gdp)'}) y log(gdp) cap 0 x x x 1 x x x 2 x x x 3 x x x 4 x x x 也接受为每列调用一次的回调。

rename

对于这种特定情况,您可能希望使用

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

   y  g  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

Index.str.replace

与python中的df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1) 字符串方法类似,pandas Index和Series(仅对象dtype)为字符串和基于regex的替换定义了一个(“向量化”)replace方法。

str.replace

这比其他方法的优点是df.columns = df.columns.str.replace('gdp', 'log(gdp)') df y log(gdp) cap 0 x x x 1 x x x 2 x x x 3 x x x 4 x x x 支持正则表达式(默认情况下启用)。有关详细信息,请参阅文档。

使用str.replace

将列表传递给set_axis

使用标题列表调用axis=1。列表的长度必须与列/索引大小相等。 set_axis默认情况下会改变原始DataFrame,但您可以指定set_axis来返回修改后的副本。

inplace=False

注意:在以后的版本中,df.set_axis(['cap', 'log(gdp)', 'y'], axis=1, inplace=False) # df.set_axis(['cap', 'log(gdp)', 'y'], axis='columns', inplace=False) cap log(gdp) y 0 x x x 1 x x x 2 x x x 3 x x x 4 x x x 默认为inplace

方法链接
当我们已经有一种使用True分配列的有效方法时,为什么选择set_axis?如[本回答]中的Ted Petrou所示,(https://stackoverflow.com/a/46912050/4909087df.columns = ...在尝试链接方法时非常有用。

比较

set_axis

对战

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

前者是更自然,更流畅的语法。

答案 3 :(得分:6)

至少有五种不同的方法来重命名熊猫中的特定列,我在下面列出了它们以及原始答案的链接。我还对这些方法进行了计时,发现它们执行的效果大致相同(尽管YMMV取决于您的数据集和方案)。下面的测试案例是将A M N Z中的列重命名为A2 M2 N2 Z2一个数据列,其中列AZ包含一百万行。

# Import required modules
import numpy as np
import pandas as pd
import timeit

# Create sample data
df = pd.DataFrame(np.random.randint(0,9999,size=(1000000, 26)), columns=list('ABCDEFGHIJKLMNOPQRSTUVWXYZ'))

# Standard way - https://stackoverflow.com/a/19758398/452587
def method_1():
    df_renamed = df.rename(columns={'A': 'A2', 'M': 'M2', 'N': 'N2', 'Z': 'Z2'})

# Lambda function - https://stackoverflow.com/a/16770353/452587
def method_2():
    df_renamed = df.rename(columns=lambda x: x + '2' if x in ['A', 'M', 'N', 'Z'] else x)

# Mapping function - https://stackoverflow.com/a/19758398/452587
def rename_some(x):
    if x=='A' or x=='M' or x=='N' or x=='Z':
        return x + '2'
    return x
def method_3():
    df_renamed = df.rename(columns=rename_some)

# Dictionary comprehension - https://stackoverflow.com/a/58143182/452587
def method_4():
    df_renamed = df.rename(columns={col: col + '2' for col in df.columns[
        np.asarray([i for i, col in enumerate(df.columns) if 'A' in col or 'M' in col or 'N' in col or 'Z' in col])
    ]})

# Dictionary comprehension - https://stackoverflow.com/a/38101084/452587
def method_5():
    df_renamed = df.rename(columns=dict(zip(df[['A', 'M', 'N', 'Z']], ['A2', 'M2', 'N2', 'Z2'])))

print('Method 1:', timeit.timeit(method_1, number=10))
print('Method 2:', timeit.timeit(method_2, number=10))
print('Method 3:', timeit.timeit(method_3, number=10))
print('Method 4:', timeit.timeit(method_4, number=10))
print('Method 5:', timeit.timeit(method_5, number=10))

输出:

Method 1: 3.650640267
Method 2: 3.163998427
Method 3: 2.998530871
Method 4: 2.9918436889999995
Method 5: 3.2436501520000007

使用对您来说最直观,最容易在应用程序中实现的方法。

答案 4 :(得分:2)

使用 pandas.DataFrame.rename 功能。 选中此link以获得说明。

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

如果您要重命名多个列,则

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