Pandas数据框:高效重命名列与索引的实用技巧

这是文章《Pandas重命名列和索引》的第1部分(共1部分)。

内容片段: 有时候我们希望在Pandas DataFrame对象中重命名列和索引。我们可以使用pandas DataFrame的`rename()`函数来实现这一目的。它支持以下参数:

  • `mapper`: 字典或函数,用于应用于列或索引。`axis`参数决定了目标轴——列或索引。
  • `index`: 必须是字典或函数,用于更改索引名称。
  • `columns`: 必须是字典或函数,用于更改列名称。
  • `axis`: 可以是整数或字符串。与`mapper`参数一起使用,用于定义目标轴。允许的值为`(‘index’, ‘columns’)`或数字`(0, 1)`。默认值为`’index’`。
  • `inplace`: 如果设置为`True`,则直接修改原DataFrame;否则,返回一个新的DataFrame,原DataFrame保持不变。默认值为`’False’`。
  • `level`: 可以是整数或级别名称。在`MultiIndex`情况下使用,仅重命名指定级别中的标签。
  • `errors`: 可能的值为`(‘ignore’, ‘raise’)`,默认值为`’ignore’`。如果指定为`’raise’`,当字典形式的`mapper`、`index`或`columns`包含在转换的索引中不存在的标签时,将引发`KeyError`。如果为`’ignore’`,则现有键将被重命名,而额外的键将被忽略。

关于`rename()`函数的一些重要要点:

    1. 以下是该原文的中文表达:

建议使用关键字参数以明确指定意图。
根据字典中的值,我们可以使用此函数重命名单个列或多个列。

让我们来看一些使用Pandas `rename()`函数的示例。

1. 重命名Pandas的多个列

import pandas as pd

d1 = {'Name': ['Pankaj', 'Lisa', 'David'], 'ID': [1, 2, 3], 'Role': ['CEO', 'Editor', 'Author']}

df = pd.DataFrame(d1)

print('原始DataFrame:\n', df)

# 重命名列
df1 = df.rename(columns={'Name': '员工姓名', 'ID': '员工ID', 'Role': '员工角色'})
print('结果DataFrame:\n', df1)

输出:

原始DataFrame:
      Name  ID    Role
0  Pankaj   1     CEO
1    Lisa   2  Editor
2   David   3  Author
结果DataFrame:
   员工姓名  员工ID 员工角色
0  Pankaj      1     CEO
1    Lisa      2  Editor
2   David      3  Author

上述的`rename()`函数调用也可以用以下方式进行编写:

df1 = df.rename(mapper={'Name': '员工姓名', 'ID': '员工ID', 'Role': '员工角色'},
                axis='columns')  # axis=1 对应列

很明显,使用关键字参数比使用`mapper`和`axis`参数更清晰。

2. 重命名Pandas中的单个列

如果您想重命名单个列,只需在`columns`字典参数中传递单个键值对即可。

df1 = df.rename(columns={'Name': '员工姓名'})
print(df1)

输出:

  员工姓名  ID    Role
0  Pankaj   1     CEO
1    Lisa   2  Editor
2   David   3  Author

如果在列字典中存在一个不匹配的映射,则结果将相同。

df1 = df.rename(columns={'Name': '员工姓名', 'X': 'Y'})  # 结果相同,因为没有名为X的列

3. 重命名Pandas索引

如果你想重命名索引,请将字典作为`index`参数传递。

df2 = df.rename(index={0: '#0', 1: '#1', 2: '#2'})
print('重命名后的索引:\n', df2)

输出:

重命名后的索引:
       Name  ID    Role
#0  Pankaj   1     CEO
#1    Lisa   2  Editor
#2   David   3  Author

我们还可以使用`mapper`和`axis`参数来重命名索引。

df2 = df.rename({0: '#0', 1: '#1', 2: '#2'}, axis=0)  
# axis='index' 同样有效,第一个参数被赋值给 'mapper'

4. 重命名Pandas单个索引

df2 = df.rename(index={1: '#1'})
print(df2)

结果:

      Name  ID    Role
0   Pankaj   1     CEO
#1    Lisa   2  Editor
2    David   3  Author

5. 对DataFrame进行原地更改

如果你想要改变源DataFrame本身,将`inplace`参数设为`True`。

import pandas as pd

d1 = {'Name': ['Pankaj', 'Lisa', 'David'], 'ID': [1, 2, 3], 'Role': ['CEO', 'Editor', 'Author']}

df = pd.DataFrame(d1)

print('原始DataFrame:\n', df)

df.rename(index={0: '#0', 1: '#1', 2: '#2'}, columns={'Name': '员工姓名', 'ID': '员工ID', 'Role': '员工角色'}, inplace=True)

print('修改后的DataFrame:\n', df)

输出:

原始DataFrame:
      Name  ID    Role
0  Pankaj   1     CEO
1    Lisa   2  Editor
2   David   3  Author

修改后的DataFrame:
   员工姓名  员工ID 员工角色
#0  Pankaj      1     CEO
#1    Lisa      2  Editor
#2   David      3  Author

6. 使用映射函数来重命名列

df = pd.DataFrame({'NAME': ['Pankaj', 'Lisa'], 'ID': [1, 2], 'ROLE': ['CEO', 'Editor']})
print(df)

df.rename(mapper=str.lower, axis=1, inplace=True)
print(df)

输出:

     NAME  ID    ROLE
0  Pankaj   1     CEO
1    Lisa   2  Editor

     name  id    role
0  Pankaj   1     CEO
1    Lisa   2  Editor

7. 使用函数来重命名列和索引

import pandas as pd
import math

df = pd.DataFrame({'NAME': ['Pankaj', 'Lisa'], 'ID': [1, 2], 'ROLE': ['CEO', 'Editor']})

df.rename(columns=str.lower, index=math.degrees, inplace=True)
print(df)

输出:

            name  id    role
0.00000   Pankaj   1     CEO
57.29578    Lisa   2  Editor

8. 严格重命名并抛出键错误

import pandas as pd

df = pd.DataFrame({'NAME': ['Pankaj', 'Lisa'], 'ID': [1, 2], 'ROLE': ['CEO', 'Editor']})

df1 = df.rename(columns={'Salary': '员工薪资'})  # 不匹配的映射将被忽略

df1 = df.rename(columns={'Salary': '员工薪资'}, errors='raise')  # 不匹配的映射将引发KeyError

结果:

Traceback (most recent call last):
  File "/Users/scdev/Documents/PycharmProjects/hello-world/scdev/pandas/pandas_rename_column.py", line 58, in <module>
    df1 = df.rename(columns={'Salary': '员工薪资'}, errors='raise')
KeyError: "['Salary'] not found in axis" 

9. 参考文献

bannerAds