一文带你详解Python如何使用Pandas玩转表格数据

 更新时间:2026年03月09日 09:55:02   作者:海天一色y  
Pandas 是 Python 生态系统中最重要的数据分析库之一,由 Wes McKinney 于2008年开发,本文将全面介绍Python数据分析库Pandas的核心功能,有需要的小伙伴可以了解下

一、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 带来了重大更新:

  • PyArrow 后端:默认使用 PyArrow 字符串类型,大幅减少内存占用
  • Copy-on-Write:默认启用,避免意外的数据修改
  • 改进的异常信息:更清晰的错误提示
  • 弃用警告:移除旧版弃用功能
 # 启用 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 数据科学生态的基石,掌握它需要:

  • 理解数据结构:Series 和 DataFrame 的本质
  • 熟练选择数据:loc/iloc 的区别与应用场景
  • 掌握清洗技巧:处理真实世界的脏数据
  • 善用分组聚合:高效的数据汇总分析
  • 注意性能优化:避免低效循环,善用向量化

最佳实践建议:

  • 始终使用 .loc.iloc 而不是链式索引(df[...][...]
  • 处理大型数据集时考虑使用 PyArrow 或 Dask
  • 善用 inplace=True 减少内存拷贝(但要注意副作用)
  • 代码中保留数据处理的注释,便于复现分析流程

到此这篇关于一文带你详解Python如何使用Pandas玩转表格数据的文章就介绍到这了,更多相关Python Pandas数据分析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python学习之异常中的finally使用详解

    Python学习之异常中的finally使用详解

    这篇文章主要为大家介绍一下Python异常语法中的另一个成员—finally,通过学习finally,可以帮助我们更好的处理异常,快来跟随小编一起学习一下吧
    2022-03-03
  • python json-rpc 规范源码阅读

    python json-rpc 规范源码阅读

    这篇文章主要为大家介绍了python json-rpc 规范的源码阅读,以及jsonrpcclient与jsonrpcserver的实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 基于Python开发PPT图片提取与合并工具

    基于Python开发PPT图片提取与合并工具

    在日常工作中,我们经常需要处理PPT中的图片,本文将介绍如何使用Python开发一个图形界面工具,实现PPT图片提取和九宫格合并功能,需要的可以参考下
    2024-12-12
  • 使用Python自动化自定义字体混淆信息的方法实例

    使用Python自动化自定义字体混淆信息的方法实例

    今天小编就为大家分享一篇关于使用Python自动化自定义字体混淆信息的方法实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • 使用Python编排Dockerfile的代码详解

    使用Python编排Dockerfile的代码详解

    docker compose 是 docker 的容器编排工具,它是基于 YAML 配置,YAML 是一种配置文件格式,支持传递环境变量,但是对于复杂的容器编排显得力不从心,于是我便开发这个程序,可以像写程序一样编排 docker,感兴趣的的朋友可以参考下
    2024-08-08
  • python 通过字符串调用对象属性或方法的实例讲解

    python 通过字符串调用对象属性或方法的实例讲解

    下面小编就为大家分享一篇python 通过字符串调用对象属性或方法的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • 详解Python不同版本之间的切换方法

    详解Python不同版本之间的切换方法

    本文主要介绍了详解Python不同版本之间的切换方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Python中闭包与lambda的作用域解析

    Python中闭包与lambda的作用域解析

    这篇文章主要介绍了Python中闭包与lambda的作用域解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Python的typing模块:类型提示 (Type Hinting)全面解析

    Python的typing模块:类型提示 (Type Hinting)全面解析

    typing 模块是现代Python编程中一个极其重要的部分,typing模块是Python从脚本语言向工程化语言迈进的重要一步,本文给大家介绍Python的typing模块:类型提示 (Type Hinting)全面解析,感兴趣的朋友一起看看吧
    2025-09-09
  • python爬虫入门教程--正则表达式完全指南(五)

    python爬虫入门教程--正则表达式完全指南(五)

    要想做爬虫,不可避免的要用到正则表达式,如果是简单的字符串处理,类似于split,substring等等就足够了,可是涉及到比较复杂的匹配,当然是正则的天下,下面这篇文章主要给大家介绍了python爬虫之正则表达式的相关资料,需要的朋友可以参考下。
    2017-05-05

最新评论