Pandas

什么是 Pandas

Pandas 是一个开源的 Python 数据分析库,它提供了高性能、易用的数据结构和数据分析工具。Pandas 的核心数据结构是 DataFrame(二维表格型数据结构)和 Series(一维标签数组),这些数据结构建立在 NumPy 数组之上,但提供了更丰富的数据操作功能。

Pandas 名字来源于"Panel Data"(面板数据)和"Python Data Analysis"(Python 数据分析)的双关语,由 Wes McKinney 于2008年在 AQR Capital Management 工作时开发。最初是为了解决金融数据分析中的实际问题而设计的,后来逐渐发展成为一个通用型的数据分析工具。

Pandas 的主要功能包括:

  1. 数据清洗:处理缺失值、重复值、异常值等
  2. 数据转换:排序、过滤、分组、聚合等操作
  3. 时间序列分析:专门的日期/时间处理功能
  4. 数据可视化:与 Matplotlib 集成,可直接绘制图表
  5. 数据输入/输出:支持 CSV、Excel、SQL、JSON 等多种格式

典型应用场景示例:

  • 金融分析:计算股票收益率、构建投资组合
  • 商业智能:销售数据分析、客户行为分析
  • 科学研究:实验数据处理、统计分析
  • 网络数据分析:日志处理、用户行为追踪

Pandas 已经成为 Python 数据科学生态系统中的核心组件之一,与 NumPy、Matplotlib、Scikit-learn 等库深度集成,广泛应用于金融、统计、社会科学、工程等领域。其简洁的 API 设计和高效的底层实现(部分用 Cython 优化)使其成为数据科学家和分析师的首选工具。

Pandas 构建在 NumPy 数组结构之上,但提供了更高级的数据操作接口。其主要优势包括:

  • 处理表格数据的便捷性
  • 内置的数据对齐功能
  • 灵活处理缺失数据
  • 强大的时间序列功能
  • 高性能的合并/连接操作

核心数据结构

1. Series

Series 是 Pandas 中最基本的一维数据结构,类似于带标签的数组:

import pandas as pd
import numpy as np

# 创建Series示例
s = pd.Series([1, 3, 5, np.nan, 6, 8], 
              index=['a', 'b', 'c', 'd', 'e', 'f'],
              name='my_series')

主要特性:

  • 每个元素都有索引标签(默认从0开始的整数索引)
  • 可以包含不同类型的数据(但通常建议保持类型一致)
  • 支持向量化操作(与NumPy数组类似)
  • 具有名称属性(name)
  • 支持布尔索引和花式索引
  • 提供丰富的统计方法(mean(), std(), sum()等)

使用场景:

  • 时间序列数据
  • 实验测量数据
  • 任何需要标签的一维数据

2. DataFrame

DataFrame 是二维表格型数据结构,类似于 Excel 表格或 SQL 表:

# 创建DataFrame示例
data = {'Name': ['John', 'Anna', 'Peter', 'Linda'],
        'Age': [28, 24, 35, 32],
        'City': ['New York', 'Paris', 'Berlin', 'London']}
df = pd.DataFrame(data,
                 index=['emp1', 'emp2', 'emp3', 'emp4'],
                 columns=['Name', 'Age', 'City', 'Salary'])

主要特性:

  • 由行(index)和列(columns)组成
  • 每列可以是不同的数据类型(数值、字符串、日期等)
  • 提供强大的数据操作功能(筛选、排序、分组等)
  • 支持行列操作
  • 可以看作Series的字典

使用场景:

  • 结构化数据存储和分析
  • 数据清洗和预处理
  • 数据可视化前的数据整理
  • 机器学习的特征工程

主要功能特性

数据读取和写入

Pandas 支持多种数据格式的读取和写入:

# 读取数据示例
# CSV文件
df = pd.read_csv('data.csv', sep=',', header=0, encoding='utf-8')

# Excel文件
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')

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

# 写入数据示例
df.to_csv('output.csv', index=False)
df.to_excel('output.xlsx', sheet_name='Results')

支持的其他格式包括:

  • JSON
  • HTML
  • HDF5
  • Parquet
  • Feather
  • Stata
  • SAS
  • Pickle

数据清洗

常见的数据清洗操作:

# 处理缺失值
df.fillna(value=0)  # 用特定值填充缺失值
df.fillna(method='ffill')  # 前向填充
df.dropna(how='any')  # 删除任何包含缺失值的行
df.dropna(thresh=2)  # 保留至少2个非NA值的行

# 数据类型转换
df['column'] = df['column'].astype('float')  # 转换为浮点数
df['date'] = pd.to_datetime(df['date'])  # 转换为日期时间

# 重复值处理
df.drop_duplicates(subset=['col1', 'col2'])  # 基于特定列删除重复值
df.drop_duplicates(keep='last')  # 保留最后一次出现的重复值

# 字符串处理
df['name'] = df['name'].str.upper()  # 转换为大写
df['email'] = df['email'].str.contains('@')  # 检查包含

# 异常值处理
df = df[(df['value'] > lower_bound) & (df['value'] < upper_bound)]

数据筛选和排序

# 条件筛选
df[df['Age'] > 30]  # 筛选年龄大于30的记录
df.query('Age > 30 & City == "New York"')  # 使用query方法

# 多条件筛选
df[(df['Age'] > 25) & (df['City'] == 'New York')]
df[(df['Age'] > 30) | (df['Salary'] < 50000)]

# 排序
df.sort_values(by='Age', ascending=False)  # 按年龄降序
df.sort_values(by=['City', 'Age'])  # 先按城市,再按年龄排序

# 选择特定行和列
df.loc[['emp1', 'emp3'], ['Name', 'City']]  # 按标签选择
df.iloc[1:3, 0:2]  # 按位置选择

数据分组和聚合

# 分组统计
df.groupby('City')['Age'].mean()  # 按城市分组计算平均年龄
df.groupby('City').agg({'Age': ['mean', 'min', 'max'], 
                       'Salary': 'sum'})  # 多重聚合

# 多重分组
df.groupby(['City', 'Gender']).size()  # 计数
df.groupby(['City', 'Gender']).agg({'Age': 'mean', 
                                   'Salary': ['sum', 'std']})

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

df.groupby('City')['Age'].agg(range_func)

# 应用多个函数
df.groupby('City')['Age'].agg(['mean', 'count', 'std'])

时间序列处理

# 创建时间序列
date_rng = pd.date_range(start='1/1/2020', end='1/10/2020', freq='D')
time_series = pd.Series(np.random.randn(len(date_rng)), index=date_rng)

# 时间索引操作
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
df.resample('M').mean()  # 按月重采样计算均值

# 时间偏移
df.shift(1)  # 数据向前移动1个周期
df.tshift(freq='M')  # 索引时间偏移

# 滚动窗口操作
df.rolling(window=3).mean()  # 3天移动平均
df.expanding().sum()  # 扩展窗口求和

# 时间周期转换
df.to_period('M')  # 转换为月度周期

实际应用场景

金融数据分析

  • 股票价格分析:计算日收益率、移动平均线
  • 风险管理:计算VaR(风险价值)、波动率
  • 投资组合优化:计算资产相关性、组合收益
  • 高频交易:处理tick级数据、计算订单簿指标

商业智能

  • 销售报表:按地区/产品类别汇总销售数据
  • 客户行为分析:RFM(最近购买、频率、金额)分析
  • 库存管理:分析库存周转率、预测需求
  • 市场营销:分析广告投放效果、转化率

科学研究

  • 实验数据处理:清洗实验数据、计算统计指标
  • 统计分析:执行t检验、ANOVA分析
  • 基因组学:处理基因表达数据
  • 物理学:分析实验测量数据

网络数据分析

  • 用户日志分析:分析用户访问路径、停留时间
  • 点击流分析:计算CTR(点击率)、转化漏斗
  • A/B测试:比较实验组和对照组的指标
  • 社交网络分析:计算网络中心性指标

机器学习预处理

  • 特征工程:创建新特征、特征编码
  • 数据清洗:处理缺失值、异常值
  • 数据标准化:归一化、标准化数值特征
  • 数据集划分:创建训练集、验证集、测试集

性能优化技巧

  1. 使用向量化操作替代循环

    # 不推荐
    for i in range(len(df)):
        df.iloc[i] = df.iloc[i] * 2
    
    # 推荐
    df = df * 2
    

  2. 选择合适的数据类型

    # 将分类变量转换为category类型
    df['category_column'] = df['category_column'].astype('category')
    
    # 使用整数类型替代浮点数
    df['integer_column'] = df['integer_column'].astype('int32')
    

  3. 使用eval()和query()进行表达式评估

    # 比传统方法更快
    df.query('column1 > 100 & column2 < 50')
    pd.eval('df1 + df2 * df3')
    

  4. 处理大型数据集

    # 使用Dask处理超出内存的数据
    import dask.dataframe as dd
    ddf = dd.read_csv('large_file.csv')
    
    # 使用chunksize分块读取
    for chunk in pd.read_csv('large_file.csv', chunksize=100000):
        process(chunk)
    

  5. 高效数据存储

    # 使用HDF5或Parquet格式
    df.to_hdf('data.h5', key='df', mode='w')
    df.to_parquet('data.parquet')
    
    # 读取时只选择需要的列
    pd.read_hdf('data.h5', key='df', columns=['col1', 'col2'])
    

Pandas 的强大功能使其成为数据分析师和数据科学家的必备工具。通过灵活运用其各种功能,可以高效完成从数据清洗到分析的完整工作流程。随着Pandas的不断发展,它也在不断优化性能并添加新功能,使其在大数据处理和复杂分析场景中表现更加出色。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值