高效数据处理,从掌握Pandas开始

Pandas是Python数据分析的核心库,在数据科学、机器学习等领域不可或缺。本文系统总结了Pandas的核心知识点,帮助读者快速掌握这一强大工具。

一、Pandas简介

Pandas是基于NumPy构建的开源Python库,专门用于数据分析和处理。它提供了两种主要数据结构:​Series​(一维带标签数组)和DataFrame​(二维表格型数据结构),能够高效处理结构化数据。

与直接使用NumPy相比,Patas的主要优势在于:

  • 增强数据的可读性,提供清晰的行列标签

  • 便捷的数据处理能力

  • 丰富的输入输出接口,支持多种文件格式

  • 集成时间序列处理功能

  • 灵活处理缺失数据

安装Pandas的方法很简单,只需执行pip install pandas,使用时通常导入为import pandas as pd

二、核心数据结构

2.1 Series

Series是Pandas中最基本的一维数据结构,由一组数据及其对应的索引组成。

创建Series的方法:​

import pandas as pd
import numpy as np

# 从列表创建
s1 = pd.Series([10, 20, 30, 40])

# 指定索引
s2 = pd.Series([10, 20, 30], index=['a', 'b', 'c'])

# 从字典创建(字典键作为索引)
s3 = pd.Series({'a': 1, 'b': 2, 'c': 3})

# 从NumPy数组创建
s4 = pd.Series(np.random.randn(5))

Series常用属性和方法:​

s.values  # 获取值数组
s.index   # 获取索引
s.mean()  # 求平均值
s.sum()   # 求和
s.isnull()  # 检测缺失值
s.notnull() # 检测非缺失值
s.astype(float)  # 转换数据类型

2.2 DataFrame

DataFrame是二维表格型数据结构,可以看作是由Series组成的字典,每个Series为一列,共享同一个索引。

创建DataFrame的常用方法:​

# 从字典创建
data = {'姓名': ['张三', '李四', '王五'],
        '年龄': [25, 30, 35],
        '城市': ['北京', '上海', '广州']}
df = pd.DataFrame(data)

# 从列表创建
df2 = pd.DataFrame([[1, 2, 3], [4, 5, 6]], 
                   columns=['A', 'B', 'C'])

# 从NumPy数组创建
df3 = pd.DataFrame(np.random.randn(3, 4), 
                   columns=['A', 'B', 'C', 'D'])

# 从文件读取(如CSV)
df4 = pd.read_csv('data.csv')

DataFrame核心属性:​

df.shape      # 查看形状(行数,列数)
df.index      # 行索引
df.columns    # 列索引
df.dtypes     # 各列数据类型
df.values     # 以数组形式返回数据
df.head()     # 查看前5行
df.tail()     # 查看后5行
df.info()     # 数据框基本信息

DataFrame结构示意图

三、数据索引与选择

Pandas提供多种数据索引方法,是数据操作的基础。

3.1 基本索引方法

# 选择单列(返回Series)
df['姓名']

# 选择多列(返回DataFrame)
df[['姓名', '年龄']]

# 使用切片选择行
df[0:3]  # 前3行

# 布尔索引
df[df['年龄'] > 25]  # 选择年龄大于25的行
df[df['城市'].isin(['北京', '上海'])]  # 选择城市为北京或上海的行

3.2 标签选择(loc)和位置选择(iloc)

# loc基于标签选择
df.loc[0, '姓名']           # 选择索引为0、列名为'姓名'的值
df.loc[0:2, ['姓名', '年龄']] # 选择前3行的姓名和年龄列

# iloc基于位置选择(类似NumPy)
df.iloc[0, 1]        # 第1行第2列(从0开始)
df.iloc[0:3, 0:2]    # 前3行前2列

# 混合选择(ix已弃用,不推荐使用)

3.3 条件过滤

# 多条件筛选
df[(df['年龄'] > 25) & (df['城市'] == '北京')]

# 字符串方法筛选
df[df['姓名'].str.startswith('张')]  # 姓张的人

# 查询方法
df.query('年龄 > 25 and 城市 == "北京"')

四、数据清洗与预处理

数据清洗是数据分析的关键步骤,Pandas提供了丰富的数据清洗功能。

4.1 处理缺失值

实际数据中经常存在缺失值,Pandas用NaN表示缺失值。

# 检测缺失值
df.isnull()        # 返回布尔DataFrame,缺失值为True
df.isnull().sum()  # 每列缺失值数量

# 删除缺失值
df.dropna()              # 删除任何包含缺失值的行
df.dropna(axis=1)       # 删除任何包含缺失值的列
df.dropna(thresh=3)     # 至少包含3个非缺失值才保留

# 填充缺失值
df.fillna(0)                    # 用0填充
df.fillna(method='ffill')        # 用前一个值填充
df.fillna(method='bfill')        # 用后一个值填充
df['年龄'].fillna(df['年龄'].mean())  # 用该列均值填充

4.2 处理重复数据

# 检测重复行
df.duplicated()        # 返回布尔Series,重复行为True
df.duplicated().sum()  # 重复行数量

# 删除重复行
df.drop_duplicates()                           # 删除完全相同的行
df.drop_duplicates(subset=['姓名'])            # 基于姓名列去重
df.drop_duplicates(keep='last')               # 保留最后一条重复记录

4.3 数据转换

# 数据类型转换
df['年龄'] = df['年龄'].astype(float)  # 转换为浮点数

# 重命名列
df.rename(columns={'旧名': '新名'})

# 替换值
df.replace('北京', '北京市')          # 简单替换
df.replace({'北京': '北京市', '上海': '上海市'})  # 字典映射

# 使用map进行转换
df['城市等级'] = df['城市'].map({'北京': 1, '上海': 1, '广州': 2})

# 使用apply应用自定义函数
df['年龄组'] = df['年龄'].apply(lambda x: '青年' if x < 35 else '中年')

五、数据分组与聚合

分组聚合是数据分析中的核心操作,用于对数据进行汇总统计。

5.1 分组操作

# 基本分组
grouped = df.groupby('城市')

# 多列分组
multi_grouped = df.groupby(['城市', '年龄组'])

# 分组后选择特定列
city_group = df.groupby('城市')['年龄']

# 查看分组结果
for name, group in grouped:
    print(f"城市: {name}")
    print(group)
    print("------")

5.2 聚合计算

# 基本聚合函数
df.groupby('城市')['年龄'].mean()      # 平均年龄
df.groupby('城市')['年龄'].sum()      # 年龄总和
df.groupby('城市')['年龄'].count()    # 计数

# 多重聚合
df.groupby('城市')['年龄'].agg(['mean', 'sum', 'count'])

# 不同列不同聚合
df.groupby('城市').agg({'年龄': 'mean', '工资': 'sum'})

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

df.groupby('城市')['年龄'].agg(max_min_range)

5.3 数据透视表

数据透视表是Excel中常见的功能,Pandas也提供了相应实现。

# 简单透视表
pd.pivot_table(df, values='年龄', index='城市', aggfunc='mean')

# 复杂透视表
pd.pivot_table(df, 
               values='年龄',
               index='城市', 
               columns='性别',
               aggfunc=['mean', 'count'],
               fill_value=0,
               margins=True)  # 添加总计行

# 使用pivot进行数据重塑
df.pivot(index='日期', columns='产品', values='销售额')

六、数据合并与连接

实际分析中经常需要将多个数据源合并在一起。

6.1 concat:沿轴方向堆叠

# 纵向堆叠(增加行)
pd.concat([df1, df2], axis=0)

# 横向堆叠(增加列)
pd.concat([df1, df2], axis=1)

# 设置键标识来源
pd.concat([df1, df2], keys=['A', 'B'])

6.2 merge:数据库风格的连接

# 内连接(默认)
pd.merge(df1, df2, on='key')

# 多种连接方式
pd.merge(df1, df2, on='key', how='left')    # 左连接
pd.merge(df1, df2, on='key', how='right')   # 右连接
pd.merge(df1, df2, on='key', how='outer')   # 外连接

# 多键连接
pd.merge(df1, df2, on=['key1', 'key2'])

6.3 join:基于索引的连接

# 基于索引的连接
df1.join(df2, how='left')

# 混合连接(列与索引)
df1.join(df2, on='key')

七、时间序列处理

Pandas具有强大的时间序列处理能力,适用于金融、气象等领域。

7.1 时间对象转换

# 字符串转时间
pd.to_datetime('2023-01-01')
pd.to_datetime(['2023-01-01', '2023-01-02'])

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

7.2 时间序列操作

# 生成时间范围
pd.date_range('2023-01-01', periods=10, freq='D')  # 天
pd.date_range('2023-01-01', periods=10, freq='H')  # 小时

# 重采样(降采样)
df.resample('W').mean()  # 按周重采样求平均

# 重采样(升采样)
df.resample('6H').ffill()  # 6小时频率,前向填充

# 移动窗口计算
df.rolling(window=7).mean()  # 7天移动平均

八、数据可视化

Pandas集成了Matplotlib,可以快速实现数据可视化。

8.1 基本绘图

import matplotlib.pyplot as plt

# 折线图
df['销售额'].plot(kind='line', title='销售额趋势')
plt.show()

# 柱状图
df.groupby('城市')['年龄'].mean().plot(kind='bar')
plt.show()

# 直方图
df['年龄'].plot(kind='hist', bins=20)
plt.show()

# 散点图
df.plot(kind='scatter', x='年龄', y='工资')
plt.show()

# 饼图
df['城市'].value_counts().plot(kind='pie', autopct='%1.1f%%')
plt.show()

8.2 多子图绘制

# 创建子图
fig, axes = plt.subplots(2, 2, figsize=(12, 8))

df['年龄'].plot.hist(ax=axes[0,0], title='年龄分布')
df.groupby('城市')['工资'].mean().plot.bar(ax=axes[0,1], title='各城市平均工资')
df['工资'].plot.box(ax=axes[1,0], title='工资箱线图')
df.plot.scatter(x='年龄', y='工资', ax=axes[1,1], title='年龄-工资散点图')

plt.tight_layout()
plt.show()

九、文件读写

Pandas支持多种文件格式的读写。

9.1 常见文件格式

# CSV文件
df.to_csv('output.csv', index=False)  # 写入CSV
df = pd.read_csv('input.csv')         # 读取CSV

# Excel文件
df.to_excel('output.xlsx', sheet_name='Sheet1', index=False)
df = pd.read_excel('input.xlsx', sheet_name='Sheet1')

# 其他格式
df.to_json('data.json')  # JSON格式
df.to_sql('table', con)  # 数据库

9.2 读取参数设置

# 读取CSV时的常用参数
df = pd.read_csv('data.csv', 
                 encoding='utf-8',     # 编码格式
                 sep=',',              # 分隔符
                 header=0,             # 列名所在行
                 index_col=0,          # 索引列
                 parse_dates=['日期'],  # 解析日期列
                 na_values=['NULL', 'N/A'])  # 缺失值标识

十、性能优化技巧

处理大数据集时,性能优化很重要。

10.1 数据类型优化

# 查看数据类型
df.dtypes

# 优化数据类型减少内存占用
df['整数列'] = df['整数列'].astype('int32')    # 默认int64
df['小数列'] = df['小数列'].astype('float32') # 默认float64
df['字符串列'] = df['字符串列'].astype('category')  # 分类数据

10.2 大规模数据处理

# 分块读取大文件
chunk_iter = pd.read_csv('large_file.csv', chunksize=10000)
for chunk in chunk_iter:
    process(chunk)  # 处理每个块

# 使用高效数据类型
dtypes = {'列1': 'category', '列2': 'float32'}
df = pd.read_csv('large_file.csv', dtype=dtypes)

实战案例:销售数据分析

以下是一个简单的实战案例,展示Pandas的综合应用。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 创建示例数据
np.random.seed(42)
dates = pd.date_range('2023-01-01', periods=100, freq='D')
data = {
    '日期': dates,
    '产品': np.random.choice(['A', 'B', 'C'], 100),
    '销售额': np.random.randint(100, 1000, 100),
    '数量': np.random.randint(1, 20, 100)
}
df = pd.DataFrame(data)
df.set_index('日期', inplace=True)

# 数据分析
print("基本统计信息:")
print(df.describe())

print("\n各产品总销售额:")
product_sales = df.groupby('产品')['销售额'].sum()
print(product_sales)

# 可视化
plt.figure(figsize=(12, 6))
df.groupby('产品')['销售额'].plot(kind='hist', alpha=0.5, legend=True)
plt.title('各产品销售额分布')
plt.xlabel('销售额')
plt.legend(['产品A', '产品B', '产品C'])
plt.show()

# 时间序列分析
weekly_sales = df['销售额'].resample('W').sum()
weekly_sales.plot(kind='line', title='周销售额趋势')
plt.show()

总结

本文系统总结了Pandas的核心功能,包括:

  1. 两种核心数据结构​:Series和DataFrame

  2. 数据索引与选择​:loc、iloc、布尔索引等

  3. 数据清洗​:处理缺失值、重复值、数据转换

  4. 数据分组与聚合​:groupby、聚合函数、数据透视表

  5. 数据合并​:concat、merge、join

  6. 时间序列处理​:时间转换、重采样、移动窗口

  7. 数据可视化​:集成Matplotlib绘图

  8. 文件读写​:支持多种格式的输入输出

  9. 性能优化​:数据类型优化、分块处理

掌握这些知识点,能够应对大部分数据分析任务。Pandas的功能远不止于此,建议在实际项目中不断探索更多高级功能。

学习建议​:多动手实践,结合实际项目需求学习,逐步掌握Pandas的强大功能。官方文档是最好的参考资料,遇到问题时可以参考。

希望本文对你的Pandas学习有所帮助!欢迎在评论区留言交流。

更多推荐