杰瑞科技汇

Python DataFrame列如何高效操作?

创建一个示例 DataFrame

我们创建一个示例 DataFrame,以便在后续的例子中使用。

Python DataFrame列如何高效操作?-图1
(图片来源网络,侵删)
import pandas as pd
import numpy as np
# 创建一个字典来构建 DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
    '年龄': [25, 30, 28, 35, 22],
    '城市': ['北京', '上海', '广州', '深圳', '杭州'],
    '薪资': [12000, 15000, 13500, 18000, 11000],
    '入职日期': pd.to_datetime(['2025-01-01', '2025-05-15', '2025-03-10', '2025-11-20', '2025-07-01'])
}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)

输出:

原始 DataFrame:
   姓名  年龄  城市    薪资    入职日期
0  张三  25  北京  12000 2025-01-01
1  李四  30  上海  15000 2025-05-15
2  王五  28  广州  13500 2025-03-10
3  赵六  35  深圳  18000 2025-11-20
4  钱七  22  杭州  11000 2025-07-01

选择列

选择列是 DataFrame 操作中最频繁的操作之一。

a) 选择单列

返回一个 Pandas Series。

# 使用方括号,列名作为字符串
name_series = df['姓名']
print(type(name_series))
# <class 'pandas.core.series.Series'>
print(name_series)

输出:

Python DataFrame列如何高效操作?-图2
(图片来源网络,侵删)
0    张三
1    李四
2    王五
3    赵六
4    钱七
Name: 姓名, dtype: object

b) 选择多列

返回一个新的 DataFrame。

# 选择多列,将列名列表传入方括号
subset_df = df[['姓名', '年龄', '薪资']]
print(type(subset_df))
# <class 'pandas.core.frame.DataFrame'>
print(subset_df)

输出:

   姓名  年龄    薪资
0  张三  25  12000
1  李四  30  15000
2  王五  28  13500
3  赵六  35  18000
4  钱七  22  11000

添加列

有多种方法可以添加新列。

a) 直接赋值

最简单直接的方法。

# 添加一个新列 '部门'
df['部门'] = ['技术部', '市场部', '技术部', '销售部', '技术部']
print(df)

输出:

   姓名  年龄  城市    薪资    入职日期   部门
0  张三  25  北京  12000 2025-01-01  技术部
1  李四  30  上海  15000 2025-05-15  市场部
2  王五  28  广州  13500 2025-03-10  技术部
3  赵六  35  深圳  18000 2025-11-20  销售部
4  钱七  22  杭州  11000 2025-07-01  技术部

b) 基于现有列计算

使用算术运算或函数。

# 添加一个计算列 '年薪'
df['年薪'] = df['薪资'] * 12
print(df)

输出:

   姓名  年龄  城市    薪资    入职日期   部门      年薪
0  张三  25  北京  12000 2025-01-01  技术部  144000
1  李四  30  上海  15000 2025-05-15  市场部  180000
2  王五  28  广州  13500 2025-03-10  技术部  162000
3  赵六  35  深圳  18000 2025-11-20  销售部  216000
4  钱七  22  杭州  11000 2025-07-01  技术部  132000

c) 使用 assign() 方法

assign() 方法返回一个新的 DataFrame,不会修改原始的 df,这在链式操作中非常有用。

# 添加一个 '是否高薪' 列,薪资高于15000为 True
df_new = df.assign(是否高薪=df['薪资'] > 15000)
print(df_new)

输出:

   姓名  年龄  城市    薪资    入职日期   部门      年薪  是否高薪
0  张三  25  北京  12000 2025-01-01  技术部  144000  False
1  李四  30  上海  15000 2025-05-15  市场部  180000  False
2  王五  28  广州  13500 2025-03-10  技术部  162000  False
3  赵六  35  深圳  18000 2025-11-20  销售部  216000   True
4  钱七  22  杭州  11000 2025-07-01  技术部  132000  False

删除列

a) 使用 drop() 方法 (推荐)

这是最常用和最安全的方法。

  • axis=1 表示在列上操作。
  • inplace=True 表示在原 DataFrame 上直接修改,不返回新对象。
  • inplace=False (默认) 返回一个删除列后的新 DataFrame,原 df 不变。
# 创建一个副本用于演示
df_copy = df.copy()
# 方法1: 返回新 DataFrame,原 df_copy 不变
df_dropped = df_copy.drop('部门', axis=1)
print("删除 '部门' 列后的新 DataFrame:")
print(df_dropped)
print("\n原始的 df_copy 并未改变:")
print(df_copy)
# 方法2: 直接在原 DataFrame 上修改
df_copy.drop('入职日期', axis=1, inplace=True)
print("\n使用 inplace=True 后,df_copy 被修改:")
print(df_copy)

b) 使用 del 关键字

直接从命名空间中删除列,会永久修改原 DataFrame。

# 再次创建一个副本
df_copy2 = df.copy()
print("删除前的 df_copy2:")
print(df_copy2)
del df_copy2['年龄']
print("\n使用 del 删除 '年龄' 列后的 df_copy2:")
print(df_copy2)

重命名列

使用 rename() 方法,非常灵活。

  • 使用字典 {'旧列名': '新列名'} 来指定重命名。
  • axis=1columns 参数指定是列重命名。
# 重命名单个或多个列
df_renamed = df.rename(columns={
    '姓名': '员工姓名',
    '薪资': '月薪'
})
print("重命名后的 DataFrame:")
print(df_renamed)

输出:

重命名后的 DataFrame:
   员工姓名  年龄  城市    月薪    入职日期   部门      年薪
0    张三  25  北京  12000 2025-01-01  技术部  144000
1    李四  30  上海  15000 2025-05-15  市场部  180000
2    王五  28  广州  13500 2025-03-10  技术部  162000
3    赵六  35  深圳  18000 2025-11-20  销售部  216000
4    钱七  22  杭州  11000 2025-07-01  技术部  132000

修改列的数据类型

使用 astype() 方法。

# 将 '年龄' 列从 int64 转为 float64
df['年龄'] = df['年龄'].astype(float)
print(df.dtypes)

输出:

姓名          object
年龄         float64
城市          object
薪资           int64
入职日期    datetime64[ns]
部门          object
年薪           int64
dtype: object

列的常用操作

a) 查看列名

print(df.columns)
# Index(['姓名', '年龄', '城市', '薪资', '入职日期', '部门', '年薪'], dtype='object')

b) 检查列是否存在

if '城市' in df.columns:
    print("列 '城市' 存在")

c) 获取列的统计信息

print(df['薪资'].describe())

输出:

count      5.000000
mean   13900.000000
std     2857.738033
min    11000.000000
25%    12000.000000
50%    13500.000000
75%    15000.000000
max    18000.000000
Name: 薪资, dtype: float64

d) 对列进行排序

  • ascending=True (默认) 为升序。
  • ascending=False 为降序。
# 按 '薪资' 降序排列
df_sorted = df.sort_values(by='薪资', ascending=False)
print(df_sorted)

输出:

   姓名  年龄  城市    薪资    入职日期   部门      年薪
3  赵六  35  深圳  18000 2025-11-20  销售部  216000
1  李四  30  上海  15000 2025-05-15  市场部  180000
2  王五  28  广州  13500 2025-03-10  技术部  162000
0  张三  25  北京  12000 2025-01-01  技术部  144000
4  钱七  22  杭州  11000 2025-07-01  技术部  132000

操作 方法/代码 说明
选择单列 df['列名'] 返回一个 Series
选择多列 df[['列名1', '列名2']] 返回一个新的 DataFrame
添加列 df['新列名'] = 值 直接赋值,原地修改
添加列 df.assign(新列名=计算) 返回新 DataFrame,适合链式操作
删除列 df.drop('列名', axis=1) 返回新 DataFrame (默认)
删除列 df.drop('列名', axis=1, inplace=True) 原地修改
删除列 del df['列名'] 原地修改,直接删除
重命名列 df.rename(columns={'旧名':'新名'}) 返回新 DataFrame
修改类型 df['列名'].astype(新类型) int, float, str
查看列名 df.columns 返回一个 Index 对象
排序 df.sort_values(by='列名') 按 '列名' 的值对行进行排序

熟练掌握这些列操作,是高效使用 Pandas 进行数据分析的关键一步。

分享:
扫描分享到社交APP
上一篇
下一篇