重命名 Pandas 中的特定列
- 2025-03-18 08:56:00
- admin 原创
- 64
问题描述:
我有一个名为 的数据框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
解决方案 1:
data.rename(columns={'gdp':'log(gdp)'}, inplace=True)
结果rename
表明它接受一个字典作为参数,columns
因此您只需传递一个具有单个条目的字典即可。
另请参阅相关内容
解决方案 2:
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
解决方案 3:
如何重命名 Pandas 中的特定列?
从 v0.24+ 开始,要一次重命名一列(或多列),
DataFrame.rename()
与axis=1
或axis='columns'
(该axis
参数是在中引入的v0.21
。Index.str.replace()
用于基于字符串/正则表达式的替换。
如果需要一次性重命名所有列,
DataFrame.set_axis()
方法axis=1
。传递一个列表式序列。选项也可用于就地修改。
rename
和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+ 版本中,您现在可以指定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
(请注意,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
replace
与Python 中的字符串方法类似,pandas Index 和 Series(仅限对象 dtype)定义了一种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
使用标题列表进行调用。列表的长度必须等于列/索引大小。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
。
方法链接既然我们已经有一种有效的方法来分配列,
为什么还要选择呢?正如 Ted Petrou 所言,这个答案在尝试链接方法时很有用。set_axis
`df.columns = ...
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()
前者的语法更加自然、流畅。
解决方案 4:
在 Pandas 中,至少有五种不同的方法可以重命名特定列,我已将它们列在下面,并附上原始答案的链接。我还对这些方法进行了计时,发现它们的性能大致相同(尽管 YMMV 取决于您的数据集和场景)。下面的测试用例是将列重命名A
M
N
Z
为包含一百万行的A2
M2
N2
Z2
数据框中的列。A
`Z`
# 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
使用对您来说最直观且最容易在您的应用程序中实现的方法。
解决方案 5:
使用pandas.DataFrame.rename函数。查看此链接了解说明。
data.rename(columns = {'gdp': 'log(gdp)'}, inplace = True)
如果你打算重命名多个列,那么
data.rename(columns = {'gdp': 'log(gdp)', 'cap': 'log(cap)', ..}, inplace = True)
解决方案 6:
df.rename(columns=lambda x: {"My_sample": "My_sample_new_name"}.get(x, x))
解决方案 7:
您想要从 pandas 数据框中重命名特定列,您想要重命名的列如下: gdp
到 log(gdp)
cap
到 log(cap)
等等。
因此适当的代码将是这样的:
data.rename(
columns={
'gdp': 'log(gdp)',
'cap': 'log(cap)',
}, inplace=True
)
请参见下图中的输出:
解决方案 8:
可以通过重新创建表格来重命名
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)
扫码咨询,免费领取项目管理大礼包!