我想从
['$a', '$b', '$c', '$d', '$e']
to
['a', 'b', 'c', 'd', 'e']
我想从
['$a', '$b', '$c', '$d', '$e']
to
['a', 'b', 'c', 'd', 'e']
当前回答
假设这是您的数据帧。
可以使用两种方法重命名列。
使用dataframe.columns=[#list]df.columns=[‘a’,‘b’,‘c’,‘d’,‘e’]此方法的限制是,如果必须更改一列,则必须传递完整的列列表。此外,此方法不适用于索引标签。例如,如果您通过以下步骤:df.columns=[‘a’、‘b’、‘c’、‘d’]这将引发错误。长度不匹配:预期轴有5个元素,新值有4个元素。另一种方法是Pandasrename()方法,用于重命名任何索引、列或行df=df.rename(列={‘$a‘:‘a‘})
同样,您可以更改任何行或列。
其他回答
Pandas 0.21+答案
0.21版中的列重命名有一些重要更新。
重命名方法添加了可以设置为columns或1的axis参数。此更新使此方法与panda API的其余部分相匹配。它仍然具有索引和列参数,但不再强制您使用它们。intlace设置为False的set_axis方法允许您使用列表重命名所有索引或列标签。
Pandas 0.21示例+
构造示例DataFrame:
df = pd.DataFrame({'$a':[1,2], '$b': [3,4],
'$c':[5,6], '$d':[7,8],
'$e':[9,10]})
$a $b $c $d $e
0 1 3 5 7 9
1 2 4 6 8 10
使用axis='columns'或axis=1的重命名
df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis='columns')
or
df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis=1)
两者都会导致以下结果:
a b c d e
0 1 3 5 7 9
1 2 4 6 8 10
仍然可以使用旧方法签名:
df.rename(columns={'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'})
重命名函数还接受将应用于每个列名的函数。
df.rename(lambda x: x[1:], axis='columns')
or
df.rename(lambda x: x[1:], axis=1)
将set_axis与列表一起使用,inplace=False
可以为set_axis方法提供一个长度等于列数(或索引)的列表。目前,inplace默认为True,但在未来的版本中,inplace将默认为False。
df.set_axis(['a', 'b', 'c', 'd', 'e'], axis='columns', inplace=False)
or
df.set_axis(['a', 'b', 'c', 'd', 'e'], axis=1, inplace=False)
为什么不使用df.columns=[‘a’,‘b’,‘c’,‘d’,‘e’]?
像这样直接分配列没有错。这是一个非常好的解决方案。
使用set_axis的优点是它可以作为方法链的一部分使用,并返回DataFrame的新副本。如果没有它,在重新分配列之前,必须将链的中间步骤存储到另一个变量。
# 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()
重命名特定列
使用df.reame()函数并引用要重命名的列。并非所有列都必须重命名:
df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
# Or rename the existing DataFrame (rather than creating a copy)
df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'}, inplace=True)
最小代码示例
df = pd.DataFrame('x', index=range(3), columns=list('abcde'))
df
a b c d e
0 x x x x x
1 x x x x x
2 x x x x x
以下方法都可以工作并产生相同的输出:
df2 = df.rename({'a': 'X', 'b': 'Y'}, axis=1) # new method
df2 = df.rename({'a': 'X', 'b': 'Y'}, axis='columns')
df2 = df.rename(columns={'a': 'X', 'b': 'Y'}) # old method
df2
X Y c d e
0 x x x x x
1 x x x x x
2 x x x x x
请记住将结果指定回,因为修改不在原位。或者,指定inplace=True:
df.rename({'a': 'X', 'b': 'Y'}, axis=1, inplace=True)
df
X Y c d e
0 x x x x x
1 x x x x x
2 x x x x x
在v0.25中,如果指定了要重命名的无效列,还可以指定errors='raise'来引发错误。请参阅v0.25 rename()文档。
重新分配列标题
使用df.set_axis(),axis=1,inplace=False(返回副本)。
df2 = df.set_axis(['V', 'W', 'X', 'Y', 'Z'], axis=1, inplace=False)
df2
V W X Y Z
0 x x x x x
1 x x x x x
2 x x x x x
这将返回一个副本,但您可以通过设置inplace=True来修改DataFrame(这是<=0.24版本的默认行为,但将来可能会更改)。
您也可以直接分配标题:
df.columns = ['V', 'W', 'X', 'Y', 'Z']
df
V W X Y Z
0 x x x x x
1 x x x x x
2 x x x x x
假设这是您的数据帧。
可以使用两种方法重命名列。
使用dataframe.columns=[#list]df.columns=[‘a’,‘b’,‘c’,‘d’,‘e’]此方法的限制是,如果必须更改一列,则必须传递完整的列列表。此外,此方法不适用于索引标签。例如,如果您通过以下步骤:df.columns=[‘a’、‘b’、‘c’、‘d’]这将引发错误。长度不匹配:预期轴有5个元素,新值有4个元素。另一种方法是Pandasrename()方法,用于重命名任何索引、列或行df=df.rename(列={‘$a‘:‘a‘})
同样,您可以更改任何行或列。
我需要重命名XGBoost的功能,但它不喜欢这些功能:
import re
regex = r"[!\"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~ ]+"
X_trn.columns = X_trn.columns.str.replace(regex, '_', regex=True)
X_tst.columns = X_tst.columns.str.replace(regex, '_', regex=True)
这里有一个我喜欢用来减少打字的漂亮小函数:
def rename(data, oldnames, newname):
if type(oldnames) == str: # Input can be a string or list of strings
oldnames = [oldnames] # When renaming multiple columns
newname = [newname] # Make sure you pass the corresponding list of new names
i = 0
for name in oldnames:
oldvar = [c for c in data.columns if name in c]
if len(oldvar) == 0:
raise ValueError("Sorry, couldn't find that column in the dataset")
if len(oldvar) > 1: # Doesn't have to be an exact match
print("Found multiple columns that matched " + str(name) + ": ")
for c in oldvar:
print(str(oldvar.index(c)) + ": " + str(c))
ind = input('Please enter the index of the column you would like to rename: ')
oldvar = oldvar[int(ind)]
if len(oldvar) == 1:
oldvar = oldvar[0]
data = data.rename(columns = {oldvar : newname[i]})
i += 1
return data
下面是一个如何工作的示例:
In [2]: df = pd.DataFrame(np.random.randint(0, 10, size=(10, 4)), columns = ['col1', 'col2', 'omg', 'idk'])
# First list = existing variables
# Second list = new names for those variables
In [3]: df = rename(df, ['col', 'omg'],['first', 'ohmy'])
Found multiple columns that matched col:
0: col1
1: col2
Please enter the index of the column you would like to rename: 0
In [4]: df.columns
Out[5]: Index(['first', 'col2', 'ohmy', 'idk'], dtype='object')