Pandas 基础 — 数据分析的 Excel
🕐 预计用时:2-3 小时 | 🎯 目标:掌握 Series、DataFrame、数据读取、基础索引和数据查看
📖 今日目录
1. Pandas 是什么?
# Pandas = Python Data Analysis Library
# 是数据科学最核心的工具,没有之一!
# Pandas vs Excel
# Excel → 手动操作、行数有限、难自动化
# Pandas → 代码操作、百万行秒处理、完全自动化
# 两大核心数据结构:
# Series → 一列数据(带标签的一维数组)
# DataFrame → 一张表(带标签的二维数组)
import pandas as pd
import numpy as np
2. Series 一维数据
import pandas as pd
# 从列表创建(自动整数索引)
s = pd.Series([10, 20, 30, 40, 50])
print(s)
# 0 10
# 1 20
# 2 30
# 3 40
# 4 50
# dtype: int64
# 指定索引
s = pd.Series([10, 20, 30], index=['苹果', '香蕉', '橘子'])
print(s)
# 苹果 10
# 香蕉 20
# 橘子 30
# 从字典创建
s = pd.Series({'语文': 90, '数学': 95, '英语': 88})
print(s.values) # [90 95 88]
print(s.index) # Index(['语文', '数学', '英语'])
print(s['数学']) # 95
# 基本操作
s.mean() # 均值
s.max() # 最大值
s[s > 90] # 筛选大于 90 的
3. DataFrame 二维数据
import pandas as pd
# 从字典创建(最常用)
df = pd.DataFrame({
'姓名': ['小明', '小红', '小刚', '小美', '小强'],
'年龄': [20, 21, 19, 22, 20],
'城市': ['北京', '上海', '广州', '深圳', '杭州'],
'薪资': [8000, 12000, 7500, 15000, 9000]
})
print(df)
# 姓名 年龄 城市 薪资
# 0 小明 20 北京 8000
# 1 小红 21 上海 12000
# 2 小刚 19 广州 7500
# 3 小美 22 深圳 15000
# 4 小强 20 杭州 9000
# 从列表嵌套字典创建
data = [
{'姓名': '小明', '年龄': 20},
{'姓名': '小红', '年龄': 21},
]
df = pd.DataFrame(data)
# 从二维数组创建
df = pd.DataFrame(
np.array([[1, 2, 3], [4, 5, 6]]),
columns=['A', 'B', 'C'],
index=['第一行', '第二行']
)
# DataFrame 基础属性
df.shape # (5, 4) → 5行4列
df.dtypes # 每列的数据类型
df.columns # 列名
df.index # 行索引
df.info() # 概览:行数、列名、类型、内存
df.describe() # 数值列的统计摘要
4. 读取数据
import pandas as pd
# 读取 CSV(最常用)
df = pd.read_csv('data.csv')
df = pd.read_csv('data.csv', encoding='utf-8') # 中文编码
df = pd.read_csv('data.csv', encoding='gbk') # 部分中文文件用 gbk
# 读取 Excel
df = pd.read_excel('data.xlsx')
df = pd.read_excel('data.xlsx', sheet_name='Sheet2') # 指定工作表
# 读取 SQL
import sqlite3
conn = sqlite3.connect('database.db')
df = pd.read_sql('SELECT * FROM users', conn)
# 注意:pandas 2.2+ 建议用 SQLAlchemy 创建连接,直接传 DBAPI 连接会有警告
# from sqlalchemy import create_engine
# engine = create_engine('sqlite:///database.db')
# df = pd.read_sql('SELECT * FROM users', engine)
# 读取 JSON
df = pd.read_json('data.json')
# 读取 HTML 表格
tables = pd.read_html('https://example.com/table.html')
df = tables[0]
# 读取剪贴板(从 Excel 复制后直接读取)
df = pd.read_clipboard()
# === 保存数据 ===
df.to_csv('output.csv', index=False) # 保存 CSV(不带行号)
df.to_excel('output.xlsx', index=False) # 保存 Excel
df.to_json('output.json', force_ascii=False) # 保存 JSON(中文可读)
💡 中文 CSV 常见问题:
如果读取 CSV 出现乱码,尝试不同的 encoding:
• utf-8 — 大多数现代文件
• gbk — Windows Excel 导出的中文文件
• utf-8-sig — 带 BOM 的 UTF-8
• latin1 — 欧洲语言(兜底方案)
5. 数据查看
import pandas as pd
# 假设 df 是一个大型数据集
# df = pd.read_csv('sales.csv')
# 头尾查看
df.head() # 前 5 行(默认)
df.head(10) # 前 10 行
df.tail() # 后 5 行
df.tail(3) # 后 3 行
# 形状
df.shape # (行数, 列数)
len(df) # 行数
df.columns.tolist() # 列名列表
# 数据类型
df.dtypes # 每列类型
df.dtypes.value_counts() # 各类型有多少列
# 统计摘要
df.describe() # 数值列的 count/mean/std/min/25%/50%/75%/max
df.describe(include='all') # 包含非数值列(显示 count/unique/top/freq)
# 唯一值
df['城市'].unique() # 去重后的城市
df['城市'].nunique() # 不同城市的数量
df['城市'].value_counts() # 每个城市出现的次数
# 内存占用
df.memory_usage(deep=True) # 每列内存(字节)
df.info(memory_usage='deep') # 概览 + 内存
6. 索引与选择
import pandas as pd
df = pd.DataFrame({
'姓名': ['小明', '小红', '小刚', '小美', '小强'],
'年龄': [20, 21, 19, 22, 20],
'城市': ['北京', '上海', '广州', '深圳', '杭州'],
'薪资': [8000, 12000, 7500, 15000, 9000]
})
# === 选择列 ===
df['姓名'] # 选择单列 → Series
df[['姓名', '薪资']] # 选择多列 → DataFrame
# === 选择行:loc(基于标签)===
df.loc[0] # 第 0 行 → Series
df.loc[0:2] # 第 0-2 行(含右端!)
df.loc[0:2, ['姓名','薪资']] # 指定行和列
df.loc[df['年龄']>20] # 条件筛选
# === 选择行:iloc(基于位置)===
df.iloc[0] # 第 0 行
df.iloc[0:2] # 第 0-1 行(不含右端!)
df.iloc[0:2, 0:2] # 前2行、前2列
df.iloc[-1] # 最后一行
# === loc vs iloc 的关键区别 ===
# loc → 标签索引(右端包含)
# iloc → 位置索引(右端不包含)
# === 条件筛选(最常用!)===
df[df['年龄'] > 20] # 年龄大于 20
df[df['城市'] == '北京'] # 北京的人
df[(df['年龄'] > 20) & (df['薪资'] > 10000)] # 多条件
df[df['城市'].isin(['北京', '上海'])] # 包含在列表中
df[df['姓名'].str.contains('小')] # 字符串包含
# === 排序 ===
df.sort_values('薪资') # 按薪资升序
df.sort_values('薪资', ascending=False) # 降序
df.sort_values(['年龄', '薪资']) # 先按年龄,再按薪资
# === 重置索引 ===
df.reset_index(drop=True) # 重置为 0,1,2,...(丢弃旧索引)
💡 记住这 5 个最常用操作:
1. df['列名'] — 选列
2. df[df['列名'] > 值] — 条件筛选行
3. df.sort_values('列名') — 排序
4. df.head() — 看前几行
5. df.describe() — 统计摘要
7. 数据类型转换
import pandas as pd
# 查看类型
df.dtypes
# 转换类型
df['年龄'] = df['年龄'].astype(int) # 转整数
df['薪资'] = df['薪资'].astype(float) # 转浮点
df['姓名'] = df['姓名'].astype(str) # 转字符串
# 字符串转日期
df['日期'] = pd.to_datetime(df['日期']) # 自动识别格式
df['日期'] = pd.to_datetime(df['日期'], format='%Y-%m-%d')
# 日期提取
df['年'] = df['日期'].dt.year
df['月'] = df['日期'].dt.month
df['日'] = df['日期'].dt.day
df['星期'] = df['日期'].dt.day_name() # 默认返回英文(Monday...),中文需自定义映射
# 数值转分类(节省内存)
df['年龄'] = df['年龄'].astype('category')
# 字符串操作
df['城市'].str.strip() # 去空格
df['城市'].str.upper() # 转大写
df['姓名'].str.len() # 字符串长度
df['邮箱'].str.split('@').str[0] # 提取 @ 前面的部分
8. 今日练习
🏋️ 练习 1:创建学生成绩表
# 创建一个 5 人 3 科成绩的 DataFrame
# 计算:每人平均分、每科最高分、按平均分排名
🏋️ 练习 2:读取真实数据
# 下载一份公开数据集(如泰坦尼克号)
# 用 pd.read_csv() 读取
# 查看:shape、dtypes、head、describe、缺失值统计
🏋️ 练习 3:条件筛选
# 对一个销售数据 DataFrame:
# 1. 筛选金额 > 1000 的订单
# 2. 筛选北京和上海的订单
# 3. 筛选 2026 年 1 月的订单
# 4. 按金额降序排列前 10 名
9. 今日小结
| |
|---|
| |
| |
| read_csv / read_excel / read_sql / read_json |
| head / shape / dtypes / describe / info |
| []列 / loc标签 / iloc位置 / 条件筛选 |
| astype / to_datetime / dt.year / str方法 |
🚀 明日预告:Day 74 — Pandas 数据处理
缺失值处理、数据筛选、排序、分组聚合——从"能读数据"到"能处理数据",真正的数据分析师技能!