还在裸写 Python 循环统计?
今天 10 分钟,把 Pandas 磨成数据分析瑞士军刀🔪——
DataFrame × 向量化 × 透视表 × 一行画图 全套带走!
1️⃣ 安装 & 全球统一暗号
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
import pandas as pd
import numpy as np
2️⃣ 两种核心数据结构:一眼记住👀
| 维度 | 名称 | 类比 | 常用属性 |
|---|---|---|---|
| 1D | Series | 带索引的数组 | s.index s.values |
| 2D | DataFrame | 电子表格 | df.columns df.index df.shape |
s = pd.Series([1, 3, 5], index=['a', 'b', 'c'])
df = pd.DataFrame({'name': ['Tom', 'Jerry'], 'age': [20, 21]})
3️⃣ 读取数据:一键 CSV / Excel / SQL💡
# CSV
df = pd.read_csv('data.csv', parse_dates=['日期'], dtype={'销量': int})
# Excel
df = pd.read_excel('sale.xlsx', sheet_name='2024', usecols=['A:C'])
# SQL
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://user:pwd@host/db')
df = pd.read_sql('SELECT * FROM orders', engine)
4️⃣ 10 个必备速查命令(80% 时间用它们)📊
df.head() # 默认前 5 行
df.info() # 列类型 + 非空计数
df.describe() # 数值统计
df['col'].value_counts() # 分类计数
df.isna().sum() # 缺失值
df.dropna() # 删空
df.fillna(0) # 填 0
df.sort_values('销量', ascending=False)
df.groupby('城市')['销量'].sum()
df.drop_duplicates()
5️⃣ 新增 / 筛选 / 排序:向量化速度×40⚡️
# 新增列
df['利润'] = df['销售额'] - df['成本']
df['级别'] = df['利润'].apply(lambda x: '高' if x > 100 else '低')
# 布尔索引
high = df[df['利润'] > 100]
# 多条件
df[(df['城市'] == '上海') & (df['利润'] > 50)]
6️⃣ 合并数据:SQL 爱好者福音🎉
# 横向拼接
pd.concat([df1, df2], axis=0, ignore_index=True)
# 横向连接
pd.merge(df_order, df_city, on='城市ID', how='left')
# 透视表 = 行列汇总
pd.pivot_table(df, values='销量', index='月份', columns='城市', aggfunc='sum')
7️⃣ 时间序列:Pandas 的“主场”📅
df['日期'] = pd.to_datetime(df['日期'])
df.set_index('日期', inplace=True)
df_month = df.resample('M').sum() # 按月聚合
df['同比'] = df['销量'].pct_change(periods=12) # 同比 %
8️⃣ 一行出图:pandas 内置绘图🎨
import matplotlib.pyplot as plt
df.groupby('月份')['销量'].sum().plot(kind='bar', figsize=(6, 3))
plt.title('月度销量')
plt.show()
底层走的 Matplotlib,Seaborn 也能直接吃 DataFrame!
9️⃣ 性能小贴士:加速 3 连招🚀
| 技巧 | 代码 | 效果 |
|---|---|---|
| 向量化 | df['新'] = df['a'] * 2 | 比 apply 快 40 倍 |
| 分块 | for chunk in pd.read_csv(..., chunksize=1e5): | 内存占 ↓10 倍 |
| 类型指定 | dtype={'ID': 'string'} | 读入即省 30% 内存 |
🔟 易错点 Top5⚠️
| 坑 | 错误示范 | 正确 |
|---|---|---|
| 链式赋值警告 | df[df['a']>0]['b']=1 | df.loc[df['a']>0, 'b'] = 1 |
| 日期没转 | 直接字符串排序 | pd.to_datetime |
| 空值参与计算 | df['col'].sum() 意外 NA | dropna / fillna |
| 索引重复 | df.merge 后行数爆炸 | 先 drop_duplicates |
| 大文件一次性读 | 内存爆炸 | 用 chunksize 或 usecols |
🏁 口诀总结(背它!)
“read 读数据,head 看结构;
loc 精准选,group 聚合快;
缺失 fillna,时间 resample;
**一行 plot 出图,搞定数据分析路!”**🎵