当前位置: 代码网 > it编程>前端脚本>Python > 一文带你详解Python如何使用Pandas玩转表格数据

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

2026年03月09日 Python 我要评论
一、pandas 是什么pandas 是 python 生态系统中最重要的数据分析库之一,由 wes mckinney 于2008年开发。它建立在 numpy 之上,提供了高性能、易用的数据结构和数据

一、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数据分析内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com