以熊猫为单位重命名特定列

我有一个名为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
438262 次浏览
data.rename(columns={'gdp':'log(gdp)'}, inplace=True)

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

也可参见相关的

如果需要重命名单个列,使用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

如何重命名熊猫中的特定列?

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

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

  • DataFrame.set_axis()方法与axis=1。传递一个类似列表的序列。也可以进行就地修改。

renameaxis=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

类似于python中字符串的replace方法,pandas Index和Series(仅对象dtype)定义了一个("vectorized") 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支持regex(默认启用)。更多信息请参见文档。


axis=1传递一个列表给set_axis

用一个头文件列表调用set_axis。列表的长度必须等于列/索引的大小。默认情况下,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

< p > 方法链接
既然已经有了用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()

前者是更自然和自由流动的语法。

至少有五种不同的方法来重命名pandas中的特定列,我在下面列出了它们以及原始答案的链接。我还对这些方法进行了计时,发现它们的执行情况大致相同(不过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

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

使用pandas.DataFrame.rename函数。

. properties

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

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

data.rename(columns = {'gdp': 'log(gdp)', 'cap': 'log(cap)', ..}, inplace = True)
df.rename(columns=lambda x: {"My_sample": "My_sample_new_name"}.get(x, x))

Ewe可以重命名表

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)