天空大作战
94.86M · 2026-02-04
想象一下,在数据分析工作中,如果你需要处理百万行 Excel 表格、清洗杂乱的数据、计算复杂的统计指标,就像用一把小勺子在挖土堆,不仅效率低下还容易出错。Pandas 正是为解决这个痛点而生的工具——它是 Python 数据分析领域的"瑞士军刀"。
Pandas 是基于 NumPy 构建的开源数据分析库,专门用于处理结构化数据。它填补了 NumPy 在处理非数值数据和混合类型数据方面的空白,让数据分析变得像操作 Excel 表格一样简单直观,同时具备处理大规模数据的高性能。
在 Python 数据科学生态中,Pandas 处于核心地位:上游连接数据源(CSV、Excel、SQL、JSON 等多种格式),下游衔接 NumPy(数值计算)、Matplotlib(可视化)和 Scikit-learn(机器学习)。掌握了 Pandas,你就拥有了从数据获取到建模准备的全流程能力。
Pandas 的安装非常简单,支持多种安装方式:
# 方式1:使用 pip 安装(推荐)
pip install pandas
# 方式2:使用 conda 安装
conda install pandas
# 国内用户可使用镜像源加速
pip install pandas -i
安装完成后,在 Python 环境中导入并验证:
# 导入 pandas(约定俗成使用 pd 作为别名)
import pandas as pd
import numpy as np
# 打印版本号(确保安装成功)
print(pd.__version__) # 输出版本号,如 2.3.0
让我们通过一个简单的示例来体验 Pandas 的核心功能:
import pandas as pd
# 创建一个简单的字典数据
data = {
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 28],
'城市': ['北京', '上海', '广州']
}
# 将字典转换为 DataFrame(表格)
df = pd.DataFrame(data)
# 打印结果
print(df)
逐行解释:
import pandas as pd:导入 Pandas 库,使用 pd 作为别名,这是 Python 社区的约定data = {...}:创建一个字典,包含姓名、年龄、城市三个字段的数据df = pd.DataFrame(data):将字典转换为 DataFrame 对象,这是 Pandas 的核心数据结构,类似 Excel 表格print(df):输出表格内容运行结果:
姓名 年龄 城市
0 张三 25 北京
1 李四 30 上海
2 王五 28 广州
看到这个结果,你可能已经发现了 Pandas 的优势:它自动为数据添加了行索引(0, 1, 2),并以整齐的表格形式展示数据,比 Python 原生的列表或字典直观得多。
Pandas 的两大核心数据结构是 Series(一维序列)和 DataFrame(二维表格)。理解它们的区别和联系是掌握 Pandas 的关键。
Series 是一个一维的带标签数组,可以理解为"带索引的列表"。每个元素都有一个对应的索引标签,默认是 0 开始的整数,也可以自定义。
# 创建 Series
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'], name='数值')
print(s)
输出:
a 10
b 20
c 30
Name: 数值, dtype: int64
核心属性:
values:获取数据值(返回 NumPy 数组)index:获取索引标签dtype:数据类型(如 int64、float64、object 等)DataFrame 是二维的表格结构,可以理解为"多个 Series 按列组合而成"。它既有行索引也有列索引,类似 Excel 表格或数据库表。
# 从字典创建 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 28],
'薪资': [15000, 20000, 18000]
}
df = pd.DataFrame(data)
print(df)
输出:
姓名 年龄 薪资
0 张三 25 15000
1 李四 30 20000
2 王五 28 18000
核心属性:
shape:数据维度(行数,列数)columns:列名(类似索引)index:行索引values:底层数据数组graph TD
A[NumPy数组] --> B[Series 一维序列]
B --> C[DataFrame 二维表格]
C --> D[数据分析操作]
C --> E[数据可视化]
C --> F[机器学习]
B -.->|组合成| C
C -.->|提取为| B
style B fill:#e1f5ff
style C fill:#ffe1e1
这个图展示了 Pandas 的数据结构层级关系:
Series 基于 NumPy 数组构建,增加了标签索引功能DataFrame 由多个 Series 按列组合而成DataFrame 中提取单列会返回 SeriesSeries 可以通过 to_frame() 方法转换为 DataFrame关键特性:
NaN(Not a Number)缺失值让我们通过一个完整的实战项目来体验 Pandas 的强大功能。假设我们有一份销售数据,需要进行分析和统计。
我们有某公司 2024 年上半年的销售数据,需要完成以下任务:
我们将使用 Pandas 的以下功能:
head()、info()、describe()groupby() + 聚合函数sort_values()import pandas as pd
import numpy as np
# 步骤1:创建模拟销售数据
data = {
'日期': pd.to_datetime(['2024-01-15', '2024-01-20', '2024-02-10', '2024-02-25',
'2024-03-05', '2024-03-18', '2024-04-12', '2024-04-28',
'2024-05-08', '2024-05-22', '2024-06-05', '2024-06-18']),
'销售员': ['张三', '李四', '王五', '张三', '李四', '王五', '张三', '李四', '王五', '张三', '李四', '王五'],
'产品': ['产品A', '产品B', '产品A', '产品C', '产品B', '产品A', '产品C', '产品B', '产品A', '产品C', '产品B', '产品A'],
'销售额': [15000, 20000, 18000, 25000, 22000, 16000, 28000, 24000, 19000, 30000, 26000, 17000]
}
# 创建 DataFrame
df = pd.DataFrame(data)
# 步骤2:查看数据概况
print("=== 数据概况 ===")
print(f"数据形状:{df.shape}")
print(f"n前5行数据:n{df.head()}")
# 步骤3:计算基本统计信息
print("n=== 销售额统计 ===")
print(df['销售额'].describe())
# 步骤4:筛选高销售额订单(>20000)
high_sales = df[df['销售额'] > 20000]
print("n=== 高销售额订单(>20000)===")
print(high_sales[['销售员', '产品', '销售额']])
# 步骤5:按月份统计销售总额
df['月份'] = df['日期'].dt.to_period('M')
monthly_sales = df.groupby('月份')['销售额'].sum()
print("n=== 月度销售总额 ===")
print(monthly_sales)
# 步骤6:统计各销售员的总销售额
salesman_total = df.groupby('销售员')['销售额'].sum().sort_values(ascending=False)
print("n=== 销售员业绩排名 ===")
print(salesman_total)
# 步骤7:找出最佳销售员
best_salesman = salesman_total.index[0]
best_total = salesman_total.iloc[0]
print(f"n最佳销售员是:{best_salesman},总销售额:{best_total:,}")
将上述代码保存为 .py 文件并运行,你会看到如下输出:
=== 数据概况 ===
数据形状:(12, 4)
前5行数据:
日期 销售员 产品 销售额
0 2024-01-15 张三 产品A 15000
1 2024-01-20 李四 产品B 20000
2 2024-02-10 王五 产品A 18000
3 2024-02-25 张三 产品C 25000
4 2024-03-05 李四 产品B 22000
=== 销售额统计 ===
count 12.000000
mean 21833.333333
std 4783.921287
min 15000.000000
25% 18250.000000
50% 21500.000000
75% 25500.000000
max 30000.000000
Name: 销售额, dtype: float64
=== 高销售额订单(>20000)===
销售员 产品 销售额
3 张三 产品C 25000
4 李四 产品B 22000
6 张三 产品C 28000
7 李四 产品B 24000
9 张三 产品C 30000
10 李四 产品B 26000
=== 月度销售总额 ===
月份
2024-01 35000
2024-02 43000
2024-03 38000
2024-04 52000
2024-05 49000
2024-06 43000
Freq: M, Name: 销售额, dtype: int64
=== 销售员业绩排名 ===
销售员
张三 98000
李四 92000
王五 70000
Name: 销售额, dtype: int64
最佳销售员是:张三,总销售额:98,000
通过这个实战案例,我们完成了:
head() 快速预览describe() 获得销售额的全面统计(均值、最值、标准差等)df['销售额'] > 20000 筛选高价值订单dt.to_period('M') 提取月份groupby() + sum() 按月份和销售员统计sort_values() 找出业绩最好的销售员这个项目涵盖了 Pandas 最核心的操作流程,展示了如何用简洁的代码完成复杂的数据分析任务。
错误 1:链式赋值导致 SettingWithCopyWarning
# 错误做法
df[df['年龄'] > 30]['薪资'] = 0 # 可能报警告,且不会生效
# 正确做法
df.loc[df['年龄'] > 30, '薪资'] = 0 # 使用 loc 直接修改
错误 2:混淆 iloc 和 loc
# 错误做法
df[0:3, '姓名'] # 语法错误,不能同时用位置和标签
# 正确做法
df.iloc[0:3]['姓名'] # 按位置选择
df.loc[0:2, '姓名'] # 按标签选择
错误 3:忘记处理缺失值
# 错误做法
df['年龄'].mean() # 如果有 NaN,结果也是 NaN
# 正确做法
df['年龄'].fillna(0).mean() # 先填充再计算
# 或
df['年龄'].mean(skipna=True) # 跳过缺失值
int64 降级为 int32 可节省 50% 内存for 循环处理数据,向量化操作快 10-100 倍read_csv(chunksize=100000) 分块加载copy() 避免链式赋值警告datetime 类型,便于后续时间序列分析Pandas 的功能远不止于此,掌握基础后你可以继续探索:
高级功能:
pivot_table() 实现复杂的数据重组merge()、join()、concat() 实现类似 SQL 的连接操作eval()、query() 加速复杂计算生态扩展:
学习路径:
推荐资源:
掌握 Pandas 是数据分析师的必备技能,它能让你的数据分析工作从"手工操作"升级为"自动化处理",效率提升何止十倍!