

大家好,我是正在实战各种AI项目的程序员晚枫。
欢迎来到Pandas的世界!
Pandas是Python数据分析的核心库,它提供了两个强大的数据结构:Series和DataFrame。掌握它们,你就能像操作Excel一样处理数据,而且更快更强。
为什么用Pandas?
Excel vs Pandas
| 能力 | Excel | Pandas |
|---|
| 数据量 | 100万行卡顿 | 千万行流畅 |
| 自动化 | 手动操作 | 代码复现 |
| 复杂计算 | 公式受限 | Python灵活 |
| 数据源 | 本地文件 | 数据库/API |
一句话:Excel能做的Pandas都能做,而且做得更好。
Series:一维数据
Series就像Excel的一列,带索引的数组。
创建Series
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import pandas as pd
s = pd.Series([85, 90, 78, 92]) print(s)
s = pd.Series([85, 90, 78, 92], index=['Alice', 'Bob', 'Charlie', 'David']) print(s)
|
Series基本操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| print(s['Alice']) print(s[0])
print(s['Alice':'Charlie'])
print(s[s > 80])
print(s.mean()) print(s.max()) print(s.describe())
|
DataFrame:二维表格
DataFrame就是Excel的整张表,有行索引和列名。
创建DataFrame
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| data = { '姓名': ['Alice', 'Bob', 'Charlie'], '年龄': [25, 30, 35], '城市': ['北京', '上海', '广州'], '薪资': [8000, 12000, 15000] } df = pd.DataFrame(data) print(df)
df = pd.DataFrame([ ['Alice', 25, '北京', 8000], ['Bob', 30, '上海', 12000], ['Charlie', 35, '广州', 15000] ], columns=['姓名', '年龄', '城市', '薪资'])
import numpy as np df = pd.DataFrame( np.random.randn(5, 3), columns=['A', 'B', 'C'], index=['a', 'b', 'c', 'd', 'e'] )
|
查看数据
1 2 3 4 5 6 7 8 9 10 11
| print(df.shape) print(df.columns) print(df.index) print(df.dtypes)
print(df.head(2)) print(df.tail(2)) print(df.info()) print(df.describe())
|
数据选择
选择列
1 2 3 4 5 6 7 8
| ages = df['年龄']
subset = df[['姓名', '薪资']]
df['工作年限'] = df['年龄'] - 22
|
选择行
1 2 3 4 5 6 7 8
| df.iloc[0] df.iloc[0:2] df.iloc[[0, 2]]
df.loc[0] df.loc[0:2]
|
同时选择行列
1 2 3 4 5 6 7
| df.loc[0, '姓名'] df.loc[0:2, ['姓名', '薪资']]
df.iloc[0, 0] df.iloc[0:2, 0:3]
|
条件筛选
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| high_salary = df[df['薪资'] > 10000]
result = df[(df['薪资'] > 10000) & (df['年龄'] < 35)]
result = df[(df['城市'] == '北京') | (df['城市'] == '上海')]
result = df[df['城市'].isin(['北京', '上海'])]
result = df[df['姓名'].str.contains('li')]
|
排序和排名
1 2 3 4 5 6 7 8 9
| df.sort_values('薪资') df.sort_values('薪资', ascending=False)
df.sort_values(['城市', '薪资'], ascending=[True, False])
df['薪资排名'] = df['薪资'].rank(ascending=False)
|
常用属性
1 2 3 4
| print(df.values) print(df.T) print(df.size) print(df.empty)
|
实战:员工信息管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| import pandas as pd
employees = pd.DataFrame({ '姓名': ['张三', '李四', '王五', '赵六', '钱七'], '部门': ['技术', '销售', '技术', '人事', '销售'], '入职年份': [2019, 2020, 2021, 2019, 2022], '月薪': [15000, 12000, 18000, 10000, 11000] })
employees['年薪'] = employees['月薪'] * 14
tech_high = employees[(employees['部门'] == '技术') & (employees['月薪'] > 16000)]
dept_stats = employees.groupby('部门').agg({ '月薪': ['mean', 'min', 'max'], '姓名': 'count' })
print("=== 员工信息 ===") print(employees) print("\n=== 技术部高薪员工 ===") print(tech_high) print("\n=== 部门统计 ===") print(dept_stats)
|
性能对比:DataFrame vs Excel vs SQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import pandas as pd import numpy as np import time
df = pd.DataFrame({ 'category': np.random.choice(['A', 'B', 'C', 'D'], 100000), 'value': np.random.randn(100000) * 100 + 500 })
start = time.time() result = df.groupby('category')['value'].agg(['mean', 'sum', 'count']) print(f"Pandas: {time.time()-start:.4f}秒")
|
| 操作 | Excel | SQL | Pandas |
|---|
| 10万行分组聚合 | 5分钟 | 30秒 | 0.01秒 |
| 多条件筛选 | 2分钟 | 15秒 | 0.005秒 |
| 数据透视表 | 3分钟 | N/A | 0.02秒 |
进阶用法
DataFrame的链式操作
1 2 3 4 5 6 7 8
| result = (df .query('age >= 18') .assign(income_k=lambda x: x['income'] / 1000) .groupby('city') .agg({'income_k': ['mean', 'std'], 'age': 'median'}) .round(2) )
|
MultiIndex多层索引
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| index = pd.MultiIndex.from_product([ ['华东', '华南', '华北'], ['Q1', 'Q2', 'Q3', 'Q4'] ], names=['区域', '季度'])
data = pd.Series(np.random.randint(100, 1000, 12), index=index) print(data)
print(data.loc['华东'])
print(data.loc[:, 'Q1'])
df = data.unstack()
|
避坑指南
❌ 坑1:SettingWithCopyWarning
1 2 3 4 5 6 7 8 9 10
| subset = df[df['age'] > 30] subset['score'] = 100
subset = df[df['age'] > 30].copy() subset['score'] = 100
df.loc[df['age'] > 30, 'score'] = 100
|
❌ 坑2:索引重置陷阱
1 2 3 4 5 6 7 8 9 10
| filtered = df[df['score'] > 80] print(filtered.index)
print(filtered.iloc[0]) print(filtered.loc[0])
filtered = filtered.reset_index(drop=True)
|
实战案例:分析在线教育平台学员数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| import pandas as pd import numpy as np
np.random.seed(42) n = 5000 df = pd.DataFrame({ 'user_id': range(10001, 10001 + n), 'course': np.random.choice(['Python入门', '数据分析', 'AI编程', '自动化办公'], n), 'progress': np.random.uniform(0, 100, n).round(1), 'score': np.random.normal(75, 15, n).clip(0, 100).round(1), 'study_hours': np.random.exponential(20, n).round(1), 'signup_date': pd.date_range('2025-01-01', periods=n, freq='2H'), 'is_vip': np.random.choice([True, False], n, p=[0.3, 0.7]), 'city': np.random.choice(['北京', '上海', '广州', '深圳', '成都', '重庆'], n) })
print(f"学员总数: {len(df)}") print(f"\n各课程人数:") print(df['course'].value_counts()) print(f"\n平均学习进度: {df['progress'].mean():.1f}%")
print(f"\nVIP学员平均进度: {df[df['is_vip']]['progress'].mean():.1f}%") print(f"普通学员平均进度: {df[~df['is_vip']]['progress'].mean():.1f}%")
print(f"\n各城市学员数:") print(df['city'].value_counts())
completion = df.assign(completed=df['progress'] > 80).groupby('course')['completed'].mean() print(f"\n各课程完成率:") print((completion * 100).round(1).astype(str) + '%')
|
DataFrame的常用属性和方法速查
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| df = pd.DataFrame({ 'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'], 'age': [25, 30, 35, 28, 32], 'city': ['北京', '上海', '广州', '深圳', '成都'], 'salary': [15000, 20000, 25000, 18000, 22000] })
print(df.shape) print(df.ndim) print(df.size)
print(df.columns) print(df.index) print(df.dtypes)
print(df.head(3)) print(df.tail(3)) print(df.sample(2)) print(df.describe()) print(df.info())
print(df.values) print(df.to_dict()) print(df.to_csv())
|
DataFrame数据选取速查
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| df['name'] df[['name', 'age']]
df.iloc[0] df.iloc[0:3] df.iloc[:, 0:2] df.iloc[[0, 2], [1, 3]]
df.loc[0] df.loc[0:2] df.loc[:, 'name':'age'] df.loc[df['age'] > 30]
df.at[0, 'name'] df.iat[0, 0]
|
Series vs DataFrame对比
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| s = pd.Series([1, 2, 3], index=['a', 'b', 'c']) df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
s + 10 s * 2 s > 2
s.value_counts() s.unique() s.sort_values() s.isna() s.fillna(0) s.astype(float)
type(df['A'])
|
下节预告
下一课我们将学习Pandas数据读取与保存,掌握如何导入导出各种格式的数据。
👉 继续阅读:Pandas数据读取与保存
💬 加入学习交流群
扫码加入Python学习交流群,和数千名同学一起进步:
👉 点击加入交流群
群里不定期分享:
- 数据分析实战案例
- Python学习资料
- 求职面试经验
- 行业最新动态
推荐:AI Python数据分析实战营
🎁 限时福利:送《利用Python进行数据分析》实体书
👉 点击了解详情
课程导航
上一篇: NumPy进阶-数学运算
下一篇: Pandas数据读取与保存
PS:Pandas是数据分析的核心。Series和DataFrame这两个概念一定要理解透彻。
📚 推荐教材
主教材:《Excel+Python 飞速搞定数据分析与处理(图灵出品)》
💬 联系我
主营业务:AI 编程培训、企业内训、技术咨询
🎓 AI 编程实战课程
想系统学习 AI 编程?程序员晚枫的 AI 编程实战课 帮你从零上手!