在 Python 中,处理 Pandas DataFrame 的列名是一项非常基础且重要的操作,下面我将为你详细介绍如何获取、修改、重命名和选择 DataFrame 的列名,并提供丰富的示例。

获取列名
要获取 DataFrame 的所有列名,最简单的方法是使用 DataFrame.columns 属性,它返回一个 Index 对象,你可以像操作列表一样操作它。
import pandas as pd
import numpy as np
# 创建一个示例 DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 28, 35],
'城市': ['北京', '上海', '广州', '深圳'],
'薪资': [12000, 15000, 13500, 18000]
}
df = pd.DataFrame(data)
# 获取列名
column_names = df.columns
print("列名对象类型:", type(column_names))
print("列名:", column_names)
输出:
列名对象类型: <class 'pandas.core.indexes.base.Index'>
列名: Index(['姓名', '年龄', '城市', '薪资'], dtype='object')
转换为列表:
如果你需要一个标准的 Python 列表,可以使用 .tolist() 方法。
column_list = df.columns.tolist()
print("列名列表:", column_list)
# 输出: 列名列表: ['姓名', '年龄', '城市', '薪资']
修改列名
有几种方法可以修改列名,适用于不同的场景。

直接赋值给 df.columns
这是最直接的方法,但会一次性修改所有列名,你需要提供一个包含新列名的列表,且列表长度必须与列数相同。
# 创建一个新的列名列表 new_columns = ['full_name', 'age', 'location', 'salary'] # 直接赋值 df.columns = new_columns print(df)
输出:
full_name age location salary
0 张三 25 北京 12000
1 李四 30 上海 15000
2 王五 28 广州 13500
3 赵六 35 深圳 18000
使用 rename() 方法 (推荐)
rename() 方法非常灵活,可以只修改你指定的列,而保持其他列不变,它返回一个新的 DataFrame,除非你设置 inplace=True。
使用字典映射 (最常用): 你可以提供一个字典,键是旧列名,值是新列名。

# 恢复原始列名
df.columns = ['姓名', '年龄', '城市', '薪资']
# 只修改 '姓名' 和 '薪资' 两列
df_renamed = df.rename(columns={'姓名': '员工姓名', '薪资': '月薪'})
print("修改后的 DataFrame:")
print(df_renamed)
print("\n原始 DataFrame 未改变:")
print(df)
输出:
修改后的 DataFrame:
员工姓名 年龄 城市 月薪
0 张三 25 北京 12000
1 李四 30 上海 15000
2 王五 28 广州 13500
3 赵六 35 深圳 18000
原始 DataFrame 未改变:
姓名 年龄 城市 薪资
0 张三 25 北京 12000
1 李四 30 上海 15000
2 王五 28 广州 13500
3 赵六 35 深圳 18000
使用 inplace=True (原地修改):
如果你想在原 DataFrame 上直接修改,而不是创建一个新的,可以设置 inplace=True。
df.rename(columns={'城市': '工作地点'}, inplace=True)
print(df)
输出:
姓名 年龄 工作地点 薪资
0 张三 25 北京 12000
1 李四 30 上海 15000
2 王五 28 广州 13500
3 赵六 35 深圳 18000
使用 set_axis() 方法
set_axis() 方法也可以用来设置列名(或行名),与 rename 不同,它通常用于一次性替换所有轴(列或行)的标签。
# 恢复原始列名 df.columns = ['姓名', '年龄', '城市', '薪资'] # 使用 set_axis 修改所有列名 df_new_axis = df.set_axis(['user_name', 'user_age', 'city', 'income'], axis='columns') print(df_new_axis)
输出:
user_name user_age city income
0 张三 25 北京 12000
1 李四 30 上海 15000
2 王五 28 广州 13500
3 赵六 35 深圳 18000
注意:
set_axis默认返回一个新对象,要原地修改,需要设置inplace=True。
重命名列名(小写、下划线等)
在实际项目中,我们经常需要将列名统一成某种格式,例如全部小写、用下划线连接(snake_case)等,这通常结合了字符串操作。
# 假设列名是大小写混合且有空格
df.columns = ['First Name', 'Last Name', 'Age In Years', 'City Name']
# 使用列表推导式进行重命名
df.columns = [col.lower().replace(' ', '_') for col in df.columns]
print(df)
输出:
first_name last_name age_in_years city_name
0 张三 李三 25 北京
1 张四 李四 30 上海
2 张五 李五 28 广州
3 张六 李六 35 深圳
选择列
获取列名后,最常用的操作就是选择列来进行分析。
选择单列
使用方括号 [],结果是一个 Pandas Series。
name_series = df['姓名']
print("选择 '姓名' 列:")
print(name_series)
print("类型:", type(name_series))
输出:
选择 '姓名' 列:
0 张三
1 李四
2 王五
3 赵六
Name: 姓名, dtype: object
类型: <class 'pandas.core.series.Series'>
选择多列
使用一个包含列名的列表,结果是一个 DataFrame。
subset_df = df[['姓名', '薪资']]
print("选择 '姓名' 和 '薪资' 列:")
print(subset_df)
print("类型:", type(subset_df))
输出:
选择 '姓名' 和 '薪资' 列:
姓名 薪资
0 张三 12000
1 李四 15000
2 王五 13500
3 赵六 18000
类型: <class 'pandas.core.frame.DataFrame'>
添加新列
向 DataFrame 添加新列非常简单,可以直接通过赋值实现。
# 添加一个新列 '部门' df['部门'] = ['技术部', '市场部', '技术部', '财务部'] print(df)
输出:
姓名 年龄 城市 薪资 部门
0 张三 25 北京 12000 技术部
1 李四 30 上海 15000 市场部
2 王五 28 广州 13500 技术部
3 赵六 35 深圳 18000 财务部
| 操作 | 方法 | 描述 |
|---|---|---|
| 获取列名 | df.columns |
返回一个包含所有列名的 Index 对象。 |
df.columns.tolist() |
将列名转换为 Python 列表。 | |
| 修改所有列名 | df.columns = [...] |
直接赋值一个新列表,会替换所有列名。 |
| 修改部分列名 | df.rename(columns={...}) |
使用字典映射,推荐使用,安全且灵活。 |
inplace=True |
与 rename 或 set_axis 一起使用,可在原 DataFrame 上修改。 |
|
| 批量重命名 | df.columns = [...] |
结合列表推导式和字符串方法。 |
| 选择列 | df['列名'] |
选择单列,返回 Series。 |
df[['列名1', '列名2']] |
选择多列,返回 DataFrame。 |
|
| 添加列 | df['新列名'] = [...] |
通过赋值直接添加新列。 |
掌握这些操作是使用 Pandas 进行数据清洗、转换和分析的基础。rename() 方法因其灵活性和安全性,通常是修改列名的首选。
