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()`函数的一些重要要点:
-
- 以下是该原文的中文表达:
建议使用关键字参数以明确指定意图。
根据字典中的值,我们可以使用此函数重命名单个列或多个列。
让我们来看一些使用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"