当前位置: 首页 > news >正文

数据分析利器 Pandas:用Python玩转表格数据

作者:海天一色y

日期:2026-03-03


一、Pandas 是什么?

Pandas是 Python 生态系统中最重要的数据分析库之一,由 Wes McKinney 于2008年开发。它建立在 NumPy 之上,提供了高性能、易用的数据结构数据分析工具,让处理结构化数据变得前所未有的简单。

核心定位

  • 数据清洗:处理缺失值、重复数据、格式转换

  • 数据转换:合并、重塑、透视表

  • 数据分析:分组统计、时间序列分析

  • 数据可视化:与 Matplotlib/Seaborn 无缝集成


二、核心数据结构

Pandas 提供两种主要的数据结构,理解它们是掌握 Pandas 的关键。

2.1 Series(一维数据)

Series 是带标签的一维数组,可以存储任意数据类型。

import pandas as pd import numpy as np ​ # 创建 Series s = pd.Series([1, 3, 5, np.nan, 6, 8]) print(s)

输出:

0 1.0 1 3.0 2 5.0 3 NaN 4 6.0 5 8.0 dtype: float64

关键特性:

  • 自动索引(0,1,2...)或自定义索引

  • 支持缺失值(NaN)

  • 支持向量化运算

2.2 DataFrame(二维数据)

DataFrame 是带标签的二维表格数据结构,是 Pandas 最常用的对象。

# 创建 DataFrame dates = pd.date_range('20260101', periods=6) df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD')) ​ print(df)

输出:

A B C D 2026-01-01 0.469112 -0.282863 -1.509059 -1.135632 2026-01-02 1.212112 -0.173215 0.119209 -1.044236 ...

DataFrame 构成要素:

组件说明
index行标签(行索引)
columns列标签(列名)
values底层 NumPy 数组
dtypes每列的数据类型

三、数据读取与写入

Pandas 支持几乎所有主流数据格式:

# CSV 文件 df = pd.read_csv('data.csv') df.to_csv('output.csv', index=False) ​ # Excel 文件 df = pd.read_excel('data.xlsx', sheet_name='Sheet1') df.to_excel('output.xlsx', sheet_name='Sheet1') ​ # SQL 数据库 from sqlalchemy import create_engine engine = create_engine('sqlite:///:memory:') df.to_sql('my_table', engine) ​ # JSON 数据 df = pd.read_json('data.json') ​ # 从字典创建 data = {'name': ['Alice', 'Bob'], 'age': [25, 30]} df = pd.DataFrame(data)

四、数据查看与选择

4.1 基础查看

df.head(5) # 前5行 df.tail(3) # 后3行 df.shape # 维度 (行数, 列数) df.columns # 列名 df.index # 索引 df.describe() # 统计摘要 df.info() # 详细信息

4.2 数据选择

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

# 按列选择 df['A'] # 选择单列,返回 Series df[['A', 'B']] # 选择多列,返回 DataFrame ​ # 按行选择(不推荐直接用索引) df[0:3] # 切片选择前3行 ​ # 标签选择 .loc[] df.loc['20260101'] # 选择单行 df.loc[:, ['A', 'B']] # 选择多列 df.loc['20260101':'20260103', 'A':'C'] # 行列切片 ​ # 位置选择 .iloc[] df.iloc[3] # 第4行(从0开始) df.iloc[3:5, 0:2] # 行3-4,列0-1 df.iloc[[1, 2, 4], [0, 2]] # 特定行列 ​ # 布尔索引(条件筛选) df[df['A'] > 0] # A列大于0的行 df[(df['A'] > 0) & (df['B'] < 0)] # 多条件组合 df[df['A'].isin([1, 2, 3])] # 包含判断

五、数据清洗(Data Cleaning)

真实数据往往 messy,Pandas 提供了强大的清洗工具:

5.1 处理缺失值

# 检测缺失值 df.isnull() # 返回布尔矩阵 df.isnull().sum() # 每列缺失值计数 ​ # 删除缺失值 df.dropna() # 删除包含NaN的行 df.dropna(axis=1) # 删除包含NaN的列 df.dropna(how='all') # 只删除全为NaN的行 ​ # 填充缺失值 df.fillna(0) # 用0填充 df.fillna(df.mean()) # 用均值填充 df.fillna(method='ffill') # 前向填充 df.fillna(method='bfill') # 后向填充 df.interpolate() # 插值填充

5.2 处理重复值

df.duplicated() # 检测重复行 df.drop_duplicates() # 删除重复行 df.drop_duplicates(subset=['A', 'B'], keep='last') # 基于特定列

5.3 数据类型转换

df['A'].astype(float) # 转换为浮点型 df['B'].astype('category') # 转换为类别型(节省内存) pd.to_datetime(df['date']) # 转换为日期时间 pd.to_numeric(df['col'], errors='coerce') # 强制转换,无效值变NaN

5.4 字符串处理

df['name'].str.lower() # 转小写 df['name'].str.contains('John') # 包含判断 df['name'].str.replace('a', 'b')# 替换 df['email'].str.split('@') # 分割 df['name'].str[:3] # 切片

六、数据转换与重塑

6.1 应用函数

# apply:沿轴应用函数 df.apply(np.cumsum) # 累积和 df.apply(lambda x: x.max() - x.min()) # 极差 ​ # applymap:逐元素应用(仅DataFrame) df.applymap(lambda x: len(str(x))) ​ # map:仅用于 Series df['A'].map(lambda x: x**2)

6.2 数据合并

# concat:轴向连接 pd.concat([df1, df2]) # 纵向拼接(行) pd.concat([df1, df2], axis=1) # 横向拼接(列) ​ # merge:数据库风格的合并 pd.merge(df1, df2, on='key') # 内连接 pd.merge(df1, df2, on='key', how='left') # 左连接 pd.merge(df1, df2, left_on='lkey', right_on='rkey') # 不同键名 ​ # join:基于索引合并 df1.join(df2, how='outer')

6.3 数据重塑

# pivot:透视表 df.pivot(index='date', columns='variable', values='value') ​ # melt:宽格式转长格式 pd.melt(df, id_vars=['id'], value_vars=['A', 'B']) ​ # stack/unstack:层级索引操作 df.stack() # 列旋转为行 df.unstack() # 行旋转为列 ​ # pivot_table:高级透视表 df.pivot_table(values='D', index='A', columns='B', aggfunc=np.sum)

七、分组与聚合(GroupBy)

这是 Pandas 最强大的功能之一,遵循Split-Apply-Combine策略:

# 基础分组 df.groupby('A').sum() # 按A分组求和 df.groupby(['A', 'B']).mean() # 多列分组求均值 ​ # 多聚合操作 df.groupby('A').agg({ 'B': ['min', 'max', 'mean'], 'C': 'sum' }) ​ # 转换(保持原形状) df.groupby('A').transform(lambda x: (x - x.mean()) / x.std()) ​ # 过滤 df.groupby('A').filter(lambda x: x['B'].sum() > 100) ​ # apply:自定义操作 df.groupby('A').apply(lambda x: x.sort_values('B').iloc[0])

八、时间序列处理

Pandas 最初就是为金融时间序列分析设计的:

# 创建时间范围 rng = pd.date_range('2026-01-01', periods=100, freq='D') # 日频 rng = pd.date_range('2026-01-01', periods=12, freq='M') # 月频 ​ # 时间索引 ts = pd.Series(np.random.randn(len(rng)), index=rng) ​ # 重采样(Resampling) ts.resample('M').mean() # 降采样:月均值 ts.resample('D').interpolate() # 升采样:插值 ​ # 移动窗口 ts.rolling(window=7).mean() # 7日移动平均 ts.expanding().sum() # 扩展窗口求和 ​ # 时间偏移 ts.shift(1) # 滞后1期 ts.shift(-1) # 超前1期 ​ # 时区处理 ts_utc = ts.tz_localize('UTC') ts_sh = ts_utc.tz_convert('Asia/Shanghai')

九、性能优化技巧

9.1 内存优化

# 查看内存使用 df.info(memory_usage='deep') ​ # 优化数据类型 df['int_col'] = df['int_col'].astype('int32') # 默认 int64 → int32 df['float_col'] = df['float_col'].astype('float32') df['category_col'] = df['category_col'].astype('category') # 类别型

9.2 向量化操作

避免循环,使用向量化操作:

# ❌ 慢:Python 循环 result = [] for idx, row in df.iterrows(): result.append(row['A'] + row['B']) ​ # ✅ 快:向量化 result = df['A'] + df['B'] ​ # ✅ 更快:NumPy 底层 result = df['A'].values + df['B'].values

9.3 使用 eval/query

# 大型 DataFrame 的表达式计算 df.eval('C = A + B', inplace=True) df.query('A > 0 and B < 0')

💡思考题:在处理一个 10GB 的 CSV 文件时,如何在不耗尽内存的情况下计算某列的均值?(提示:考虑chunksize参数或 Dask)

十、实战案例:数据分析流程

下面是一个完整的数据分析流程示例:

import pandas as pd import numpy as np ​ # 1. 加载数据 df = pd.read_csv('sales_data.csv', parse_dates=['date']) ​ # 2. 数据清洗 df.drop_duplicates(inplace=True) df.dropna(subset=['sales', 'quantity'], inplace=True) df['category'] = df['category'].astype('category') ​ # 3. 特征工程 df['revenue'] = df['sales'] * df['quantity'] df['month'] = df['date'].dt.to_period('M') ​ # 4. 数据分析 monthly_sales = df.groupby('month')['revenue'].sum() category_stats = df.groupby('category').agg({ 'revenue': ['sum', 'mean', 'count'], 'quantity': 'sum' }) ​ # 5. 透视分析 pivot = df.pivot_table( values='revenue', index='month', columns='category', aggfunc='sum', fill_value=0 ) ​ # 6. 导出结果 monthly_sales.to_csv('monthly_report.csv') category_stats.to_excel('category_report.xlsx')

十一、Pandas 3.0 新特性(2024+)

Pandas 3.0 带来了重大更新:

  1. PyArrow 后端:默认使用 PyArrow 字符串类型,大幅减少内存占用

  2. Copy-on-Write:默认启用,避免意外的数据修改

  3. 改进的异常信息:更清晰的错误提示

  4. 弃用警告:移除旧版弃用功能

# 启用 PyArrow 后端(推荐) df = pd.read_csv('data.csv', dtype_backend='pyarrow')

十二、学习资源推荐

资源链接说明
官方文档pandas.pydata.org最权威参考
Pandas CookbookGitHub 搜索实战技巧合集
《Python for Data Analysis》Wes McKinney 著作者亲著
Kaggle Learnkaggle.com/learn免费交互课程

Pandas 是 Python 数据科学生态的基石,掌握它需要:

  1. 理解数据结构:Series 和 DataFrame 的本质

  2. 熟练选择数据:loc/iloc 的区别与应用场景

  3. 掌握清洗技巧:处理真实世界的脏数据

  4. 善用分组聚合:高效的数据汇总分析

  5. 注意性能优化:避免低效循环,善用向量化

最佳实践建议:

  • 始终使用.loc.iloc而不是链式索引(df[...][...]

  • 处理大型数据集时考虑使用 PyArrow 或 Dask

  • 善用inplace=True减少内存拷贝(但要注意副作用)

  • 代码中保留数据处理的注释,便于复现分析流程


希望这篇博客能帮助您系统掌握 Pandas!如有疑问,欢迎在评论区讨论。

http://www.jsqmd.com/news/430774/

相关文章:

  • Denoising Diffusion Probabilistic Models -- 概率扩散模型 数学推导(2)
  • 全国好用的南阳高压防爆电机,品牌推荐及价格分析 - mypinpai
  • 突破限制的B站视频高效管理工具:从痛点到解决方案的完整指南
  • 如何彻底解放3DS自制软件管理?Universal-Updater全方位解决方案
  • 聊聊靠谱的LED显示屏专业公司,金元彩亮科技价格多少? - 工业品牌热点
  • 2026年质量好的集装箱移动房屋/装配式移动房屋直销厂家选哪家 - 品牌宣传支持者
  • Next.js 页面路由深度解析
  • 实现小说离线自由:通过fanqienovel-downloader构建个人阅读库
  • 开源动作捕捉革新:低成本突破专业级3D动作数据采集技术壁垒
  • 苏彩环保瓷砖美缝好用吗,全国品牌口碑大揭秘 - myqiye
  • 明日方舟素材资源库:全方位游戏素材与数据应用指南
  • 3步掌握中国科学技术大学LaTeX模板:学术排版从入门到精通
  • 三八节抗老眼霜推荐指南:抗老消肿全能款,丸美 S 肽小红笔硬核实力全解析 - 速递信息
  • 3个核心价值:开源AI客户端如何赋能零门槛智能交互
  • 跨平台APK管理:开发者与测试人员的效率提升指南
  • 成都有哪些招聘平台?2026本地求职招工优选指南 - 博客万
  • 基于单片机的室内空气质量监测系统(有完整资料)
  • 2026年冷却塔技术测评—闭式/开式冷却塔多场景应用分析,西安宏润泰实力超群 - 深度智识库
  • 2026年如何选择靠谱的PP回料颗粒厂家?一份来自生产一线的深度榜单 - 企师傅推荐官
  • UndertaleModTool开源工具新手教程:从零开始自定义Game Maker游戏
  • 浙江好用的重袋包装机品牌有哪些,性价比高的推荐? - 工业品牌热点
  • 零基础入门OCR模型训练实战指南:从环境部署到深度学习部署全流程
  • 产能提升83%!预制构件外加剂的真实案例解析 - 速递信息
  • 无线液位变送器产品概述 - 品牌推荐大师1
  • 华润万家购物卡回收:安全可靠的变现平台推荐 - 团团收购物卡回收
  • Markor安卓文本编辑器全攻略:从入门到专业的移动办公解决方案
  • League Akari:高效智能的英雄联盟辅助工具集
  • Blender 3MF格式全流程解决方案:从痛点突破到高效工作流构建
  • 图片数据提取工具WebPlotDigitizer:让科研图表数字化不再困难
  • 手机号查QQ号:告别跨平台查询烦恼的本地化解决方案