在pandas中重命名特定列:

300

我有一个叫做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

这个回答解决了你的问题吗?在Pandas中重命名列 - AMC
7个回答

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

rename 显示它接受一个字典作为 columns 参数,所以您只需传递一个包含单个条目的字典。

另请参见相关信息


那真是令人惊讶。这是一种不错的方法,但我还没有看到太多使用字典作为值的Pandas API。 - WestCoastProjects

48

如果您需要重命名单个列,则使用列表推导式的实现速度要快得多。

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]

或者使用一个 字典 构建映射,并通过将默认值设置为旧名称,使用其 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

3
这有点奇怪,我假设你正在使用问题中只有三列(y、gdp和cap)的DataFrame。如果你使用更多列,列表推导式版本是否仍然比使用rename快大约3倍?或者其中一个版本比另一个版本快得多? - Leland Hepworth
6
我认为Pandas的作者们不太可能会关心重命名一列所需��微秒数。 - c z
1
比什么更快? - Itération 122442

31

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

从v0.24+开始,要一次重命名一个或多个列,请使用DataFrame.rename()方法,其中设置参数axis=1axis='columns'axis参数在v0.21中引入)。

如果您需要同时重命名所有列,请使用DataFrame.set_axis()方法并设置参数axis=1。传递一个列表类型的序列。也可以选择进行就地修改。


rename with axis=1

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

从0.21版本开始,您现在可以在rename中指定一个axis参数:

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

(请注意,默认情况下rename不是就地更名,因此您需要将结果重新分配。)

这个添加是为了提高与API的其余部分一致性。新的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

对于这个具体的情况,您希望使用

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

Index.str.replace

Index.str.replace 方法类似于 Python 字符串的 replace 方法,pandas 的 Index 和 Series(仅限 object 类型)定义了一个矢量化的 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 支持正则表达式(默认启用)。详细信息请参见文档。


通过 axis=1 将列表传递给 set_axis

使用标题列表调用 set_axis。该列表的长度必须与列/索引大小相等。默认情况下,set_axis 会更改原始 DataFrame,但您可以指定 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

方法链式调用
当我们已经有一种有效的方式使用df.columns = ...来分配列时,为什么要选择set_axis呢?正如Ted Petrou在这个答案中所示,set_axis对于尝试链式调用方法非常有用。

比较

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

前者的语法更自然、流畅。


你也可以添加 inplace=True 使 .replace 方法就地替换。这样你就不需要再次赋值了。 - Jan Willem

9

pandas中至少有五种不同的方法可以重命名特定的列,下面我列出它们以及原始答案的链接。我还测量了这些方法的运行时间,并发现它们的性能大致相同(虽然根据您的数据集和场景可能会有所不同)。以下测试用例将把包含一百万行的列AZ的数据框中的列A M N Z重命名为A2 M2 N2 Z2

# 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://dev59.com/SWIj5IYBdhLWcg3w6JLU#19758398
def method_1():
    df_renamed = df.rename(columns={'A': 'A2', 'M': 'M2', 'N': 'N2', 'Z': 'Z2'})

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

# Mapping function - https://dev59.com/SWIj5IYBdhLWcg3w6JLU#19758398
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://dev59.com/T7Pma4cB1Zd3GeqPrX5_#58143182
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://dev59.com/h1oT5IYBdhLWcg3w2SUS#38101084
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

使用对你最直观和最易于在应用程序中实现的方法。


5
使用 pandas.DataFrame.rename 函数。 请查看此 链接 进行描述。
data.rename(columns = {'gdp': 'log(gdp)'}, inplace = True)

如果您打算重命名多个列,则

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

重复之前的回答。 - James

0
df.rename(columns=lambda x: {"My_sample": "My_sample_new_name"}.get(x, x))

太棒了。谢谢。我最终使用了这种方式 - 运行得很好! df = df.rename(columns=lambda x: {"My_sample": "My_sample_new_name"}.get(x, x)) - sharon
@sharon,我现在对pandas有一些经验了,我想告诉你,“df.rename(columns={"My_sample": "My_sample_new_name"})”可以实现相同的效果。 :) - slavny_coder

-1

我们可以通过重新制作表格来重命名

df = pd.DataFrame()
column_names = mydataframe.columns
for i in range(len(mydataframe)):
  column = mydataframe.iloc[:,i]
  df[column_names[i][:-8]+"desigred_texnt"] = column
print(df.columns)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接