Python Pandas 使用指南:数据分析的瑞士军刀

Python Pandas 使用指南:数据分析的瑞士军刀

作者:书到用时方恨少!

发布日期:2026年4月4日

阅读时长:约25分钟

📌 写在前面

在 Python 数据生态中,Pandas 如同一位全能的工匠------它基于 NumPy 构建,提供了 DataFrameSeries 两种核心数据结构,让表格数据的清洗、转换、分析和可视化变得异常优雅。无论是处理 CSV、Excel、SQL 数据库,还是进行时间序列分析、分组聚合、数据透视,Pandas 都能以直观的语法让你事半功倍。

如果说 NumPy 是数值计算的基石,那么 Pandas 就是数据分析的利器。它解决了数据处理中 80% 的痛点:缺失值处理、行列标签、多级索引、数据合并、窗口函数......无论你是数据科学家、金融分析师,还是运营人员,Pandas 都将是你日常工作中最亲密的伙伴。让我们一起走进这个强大的库,掌握数据操控的艺术!📊


1. 🧩 Pandas 是什么?为什么需要它?

1.1 从 NumPy 到 Pandas

NumPy 擅长数值运算,但缺乏对异质数据(如混合类型列)、缺失值、标签索引、时间序列的原生支持。Pandas 填补了这一空白:

  • 标签化索引:通过行索引和列名定位数据,像 Excel 一样直观。
  • 缺失值处理 :内置 NaN 概念,并提供 dropnafillna 等丰富方法。
  • 数据对齐:不同来源的数据按索引自动对齐,无需手动循环。
  • 强大的 IO 能力:支持 CSV、Excel、JSON、SQL、HTML、Parquet 等数十种格式。

1.2 核心数据结构

结构 描述 类比
Series 一维带标签数组 Excel 中的一列
DataFrame 二维带标签的表格结构 Excel 工作表
python 复制代码
import pandas as pd
import numpy as np

# Series
s = pd.Series([1, 3, 5, np.nan, 8], index=['a', 'b', 'c', 'd', 'e'])

# DataFrame
df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五'],
    '年龄': [25, 30, 35],
    '薪资': [8000, 12000, 15000]
})

2. 🚀 快速入门:创建与读取数据

2.1 创建 DataFrame

python 复制代码
# 从字典创建
df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
})

# 从 NumPy 数组创建
arr = np.random.randn(4, 3)
df2 = pd.DataFrame(arr, columns=['X', 'Y', 'Z'], index=['r1', 'r2', 'r3', 'r4'])

# 从列表的列表创建
df3 = pd.DataFrame([[1, 'a'], [2, 'b']], columns=['num', 'letter'])

2.2 读取外部数据(最常用)

python 复制代码
# CSV
df = pd.read_csv('data.csv', encoding='utf-8', parse_dates=['日期'])

# Excel(需要 openpyxl 或 xlrd)
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')

# SQL
import sqlite3
conn = sqlite3.connect('database.db')
df = pd.read_sql('SELECT * FROM table', conn)

# JSON
df = pd.read_json('data.json')

# 保存
df.to_csv('output.csv', index=False)
df.to_excel('output.xlsx', index=False)

3. 🔍 数据探索与查看

python 复制代码
df = pd.read_csv('titanic.csv')

# 快速概览
df.head(10)          # 前10行
df.tail()            # 后5行
df.info()            # 列类型、非空计数、内存
df.describe()        # 数值列的统计摘要
df.shape             # (行, 列)
df.columns           # 列名列表
df.dtypes            # 每列数据类型

# 统计
df['Age'].mean()
df['Survived'].value_counts()
df.corr()            # 相关系数矩阵

4. 🎯 数据选择与过滤

Pandas 提供了多种数据选择方式,推荐使用 .loc.iloc

4.1 按列选择

python 复制代码
df['Name']           # 单列 -> Series
df[['Name', 'Age']]  # 多列 -> DataFrame

4.2 按行选择

python 复制代码
# 标签索引(包含末尾)
df.loc[5:10, ['Name', 'Age']]

# 整数位置索引(不包含末尾)
df.iloc[5:11, [0, 2]]

# 条件过滤
df[df['Age'] > 30]
df[(df['Age'] > 30) & (df['Sex'] == 'female')]
df[df['Name'].str.contains('Brown')]

# query 方法(更简洁)
df.query('Age > 30 and Sex == "female"')

4.3 修改数据

python 复制代码
# 新增列
df['Age_Group'] = np.where(df['Age'] < 18, 'Child', 'Adult')

# 修改某列
df.loc[df['Age'] > 60, 'Age_Group'] = 'Senior'

# 删除列
df.drop('Cabin', axis=1, inplace=True)

5. 🧹 数据清洗:缺失值与重复值

5.1 缺失值处理

python 复制代码
# 检测缺失值
df.isnull().sum()          # 每列缺失数量
df['Age'].isna().sum()

# 删除缺失行
df.dropna(subset=['Age', 'Embarked'])   # 指定列中任何缺失则删除行

# 填充缺失值
df['Age'].fillna(df['Age'].median(), inplace=True)
df['Embarked'].fillna('S', inplace=True)

# 向前/向后填充
df.fillna(method='ffill')

5.2 重复值处理

python 复制代码
df.duplicated().sum()      # 重复行数
df.drop_duplicates(subset=['PassengerId'], keep='first')

6. 🔄 数据转换与运算

6.1 列运算与 apply

python 复制代码
# 向量化运算
df['Age'] = df['Age'].astype(int)
df['Fare_Dollar'] = df['Fare'] * 1.1   # 假设加10%手续费

# apply 映射
def classify_age(age):
    if age < 18: return 'Child'
    elif age < 60: return 'Adult'
    else: return 'Senior'

df['Age_Category'] = df['Age'].apply(classify_age)

# 使用 lambda
df['Name_len'] = df['Name'].apply(lambda x: len(x))

# applymap 对整个 DataFrame 每个元素
df[['Age', 'Fare']].applymap(lambda x: round(x, 1))

6.2 字符串方法(str 访问器)

python 复制代码
df['Name'].str.upper()
df['Name'].str.contains('Mr', na=False)
df['Ticket'].str.extract(r'(\d+)')   # 正则提取

6.3 日期时间处理

python 复制代码
df['Date'] = pd.to_datetime(df['Date'])
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month_name()
df['Weekday'] = df['Date'].dt.dayofweek

7. 📊 分组聚合与透视表

7.1 groupby

python 复制代码
# 单列分组聚合
df.groupby('Pclass')['Fare'].mean()

# 多列分组 + 多种聚合
df.groupby(['Pclass', 'Sex'])['Survived'].agg(['mean', 'count', 'sum'])

# 对多列使用不同函数
df.groupby('Pclass').agg({
    'Fare': 'mean',
    'Age': ['median', 'std'],
    'Survived': 'sum'
})

# 自定义聚合函数
def range_func(x):
    return x.max() - x.min()

df.groupby('Pclass')['Fare'].agg(range_func)

7.2 透视表与交叉表

python 复制代码
# 类似 Excel 数据透视表
pd.pivot_table(df, values='Fare', index='Pclass', columns='Sex', aggfunc='mean')

# 交叉表(频数统计)
pd.crosstab(df['Pclass'], df['Survived'], margins=True)

8. 🔗 合并与连接

8.1 concat(堆叠)

python 复制代码
# 垂直拼接(行追加)
df1 = pd.DataFrame({'A': [1,2], 'B': [3,4]})
df2 = pd.DataFrame({'A': [5,6], 'B': [7,8]})
pd.concat([df1, df2], axis=0, ignore_index=True)

# 水平拼接(列合并)
pd.concat([df1, df2], axis=1)

8.2 merge(类似 SQL JOIN)

python 复制代码
customers = pd.DataFrame({'id': [1,2,3], 'name': ['A','B','C']})
orders = pd.DataFrame({'cust_id': [1,1,2], 'amount': [100,200,150]})

# 内连接
pd.merge(customers, orders, left_on='id', right_on='cust_id', how='inner')

# 左连接、右连接、外连接
how='left', 'right', 'outer'

8.3 join(基于索引合并)

python 复制代码
df_left = df1.set_index('key')
df_right = df2.set_index('key')
df_left.join(df_right, how='inner')

9. 📈 时间序列分析

python 复制代码
# 创建日期范围
dates = pd.date_range('2025-01-01', periods=100, freq='D')

# 设置时间索引
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)

# 重采样(降采样/升采样)
df.resample('M').mean()          # 月均
df.resample('W').sum()           # 周总和

# 移动窗口
df['rolling_mean'] = df['Value'].rolling(window=7).mean()

# 滞后与差分
df['Shifted'] = df['Value'].shift(1)
df['Diff'] = df['Value'].diff(1)

10. 💡 实战案例

案例一:电商订单数据分析

python 复制代码
# 读取数据
orders = pd.read_csv('orders.csv', parse_dates=['order_date'])
orders['order_month'] = orders['order_date'].dt.to_period('M')

# 月度销售额
monthly_sales = orders.groupby('order_month')['amount'].sum()

# 用户复购率
user_orders = orders.groupby('user_id')['order_id'].nunique()
repeated_users = user_orders[user_orders > 1].count()
repeat_rate = repeated_users / user_orders.count()

案例二:处理缺失值的高级技巧

python 复制代码
# 按组填充缺失值(用同类别的均值)
df['Age'] = df.groupby('Pclass')['Age'].transform(lambda x: x.fillna(x.median()))

# 插值法填充时间序列
df['Value'].interpolate(method='linear', inplace=True)

案例三:拆分一列为多行(explode)

python 复制代码
df = pd.DataFrame({
    'id': [1,2],
    'items': [['apple','banana'], ['orange']]
})
df_exploded = df.explode('items')   # 每个列表元素变成单独一行

11. ⚠️ 常见陷阱与注意事项

11.1 视图与副本(SettingWithCopyWarning)

python 复制代码
# 错误方式(可能产生警告)
df[df['Age'] > 30]['NewCol'] = 1   # 链式索引,可能无效

# 正确方式
df.loc[df['Age'] > 30, 'NewCol'] = 1

11.2 忘记 inplace 参数

许多方法(如 dropfillna)默认返回新 DataFrame,需赋值或设置 inplace=True

11.3 数据类型误判

read_csv 可能将日期读为字符串,用 parse_dates 参数或 pd.to_datetime 转换。

11.4 内存占用

处理大文件时使用分块读取:

python 复制代码
chunks = pd.read_csv('large.csv', chunksize=10000)
for chunk in chunks:
    process(chunk)

11.5 避免显式循环

能用向量化、applygroupby 就尽量别用 for 循环,否则效率极低。


12. 📊 Pandas vs 其他工具

特性 Pandas SQL Excel NumPy
数据量 中等(内存级) 海量(磁盘级) 小(~1M行) 中等
缺失值 ✅ 原生 NULL 空单元格
标签索引 ✅ 强大 列名+行号 行列号 整数索引
分组聚合 ✅ 灵活 GROUP BY 透视表 需手动
时间序列 ✅ 丰富 有限 有限 一般
学习曲线 中等 中等

选型建议

  • 数据清洗、探索、中小规模分析 → Pandas
  • 海量数据、复杂查询 → SQL + 数据库
  • 简单统计、报表 → Excel
  • 纯数值计算、深度学习数据预处理 → NumPy + Pandas

13. 🎯 总结

通过本文,我们系统学习了 Pandas 的核心功能:

  • 数据结构:Series 和 DataFrame
  • 数据 IO:读写 CSV、Excel、SQL、JSON 等
  • 数据查看headinfodescribe
  • 选择与过滤lociloc、布尔索引、query
  • 数据清洗:缺失值处理、重复值、类型转换
  • 数据转换apply、字符串方法、日期处理
  • 分组聚合groupbyaggpivot_table
  • 合并拼接concatmergejoin
  • 时间序列:重采样、滑动窗口、偏移
  • 实战案例:电商分析、缺失值插补、explode 拆分
  • 注意事项:SettingWithCopy、内存、分块读取

Pandas 是数据分析师和科学家不可或缺的工具。掌握它,你将能高效地完成从数据清洗到洞察产出的全流程。纸上得来终觉浅,绝知此事要躬行------打开 Jupyter Notebook,开始你的 Pandas 实践之旅吧!

如果你有独特的 Pandas 技巧或踩过的坑,欢迎在评论区分享交流!我们下篇见!🚀

相关推荐
智算菩萨5 小时前
【Pygame】第8章 文字渲染与字体系统(支持中文字体)
开发语言·python·pygame
:mnong5 小时前
全图纸语义理解升级分析
python·openvino·paddleocr·qt6.3·paddleocr-vl
qh0526wy5 小时前
pathlib 核心功能一览
python
Hello eveybody6 小时前
PyCharm性能调优避坑录
python·pycharm
¥-oriented6 小时前
【Python桌面应用开发环境搭建指南】
开发语言·python
Etherious_Young6 小时前
用u2写一个实况足球图像识别自动化脚本(3)
python·自动化·游戏自动化
项目管理小胡6 小时前
2026年项目管理工具选型指南:功能对比、适用场景与避坑建议
java·python·安全·团队开发·个人开发
雷帝木木6 小时前
Python 数据库 ORM 实战:SQLAlchemy 详解
人工智能·python·深度学习·机器学习
在放️7 小时前
Python 爬虫 · http 协议基础
python