Python pandas 全面教程

pandas 是 Python 最强大的数据分析库,提供了高效的数据结构和数据分析工具。本教程将全面介绍 pandas 的核心功能和使用方法。

1. pandas 基础

1.1 安装与导入

pip install pandas numpy
import pandas as pd
import numpy as np

1.2 核心数据结构

Series - 一维带标签数组

s = pd.Series([1, 3, 5, np.nan, 6, 8])

DataFrame - 二维表格型数据结构

df = pd.DataFrame({
    'A': 1.,
    'B': pd.Timestamp('20230101'),
    'C': pd.Series(1, index=list(range(4)), 
    'D': np.array([3] * 4, dtype='int32'),
    'E': pd.Categorical(["test", "train", "test", "train"]),
    'F': 'foo'
})

2. 数据输入与输出

2.1 读取数据

# 从CSV
df = pd.read_csv('data.csv')
# 从Excel
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 从SQL
import sqlite3
conn = sqlite3.connect('database.db')
df = pd.read_sql('SELECT * FROM table', conn)
# 从JSON
df = pd.read_json('data.json')

2.2 保存数据

# 保存为CSV
df.to_csv('output.csv', index=False)
# 保存为Excel
df.to_excel('output.xlsx', sheet_name='Data')
# 保存为SQL
df.to_sql('table_name', conn, if_exists='replace', index=False)
# 保存为JSON
df.to_json('output.json')

3. 数据查看与检查

3.1 查看数据

df.head()       # 前5行
df.tail(3)      # 后3行
df.sample(5)    # 随机5行
df.shape        # 形状(行,列)
df.columns      # 列名
df.index        # 索引
df.dtypes       # 数据类型
df.info()       # 数据摘要
df.describe()   # 统计描述

3.2 数据选择

# 选择列
df['列名']      # 单列(Series)
df[['列1','列2']] # 多列(DataFrame)
# 选择行
df.loc[0]       # 按标签
df.iloc[0]      # 按位置
df[1:4]         # 切片
# 条件选择
df[df['年龄'] > 30]
df.query('年龄 > 30 and 城市 == "北京"')

4. 数据清洗

4.1 处理缺失值

# 检测缺失值
df.isnull()
df.isnull().sum()
# 删除缺失值
df.dropna()             # 删除含NA的行
df.dropna(axis=1)       # 删除含NA的列
df.dropna(thresh=2)     # 至少2个非NA值
# 填充缺失值
df.fillna(0)            # 用0填充
df.fillna(method='ffill') # 前向填充
df.fillna(df.mean())    # 用均值填充

4.2 数据转换

# 数据类型转换
df['列名'] = df['列名'].astype('int')
# 重命名列
df.rename(columns={'旧名':'新名'}, inplace=True)
# 替换值
df.replace({'旧值':'新值'}, inplace=True)
# 删除列
df.drop('列名', axis=1, inplace=True)
# 删除重复行
df.drop_duplicates(inplace=True)

5. 数据操作

5.1 排序

df.sort_values('列名')                  # 升序
df.sort_values('列名', ascending=False) # 降序
df.sort_values(['列1','列2'])           # 多列排序

5.2 分组聚合

# 基本分组
grouped = df.groupby('列名')
# 聚合操作
grouped.mean()
grouped.agg(['mean', 'sum', 'count'])
grouped.agg({'列1':'sum', '列2':'mean'})
# 分组后应用函数
grouped.apply(lambda x: x.max() - x.min())

5.3 数据合并

# 连接
pd.concat([df1, df2], axis=0)  # 纵向
pd.concat([df1, df2], axis=1)  # 横向
# 合并(类似SQL JOIN)
pd.merge(df1, df2, on='键列')           # 内连接
pd.merge(df1, df2, on='键列', how='left')  # 左连接

6. 时间序列

6.1 时间处理

# 转换为时间类型
df['日期'] = pd.to_datetime(df['日期列'])
# 设置时间索引
df = df.set_index('日期')
# 时间选择
df.loc['2023']          # 2023年数据
df.loc['2023-01':'2023-03'] # 1-3月数据
# 重采样
df.resample('M').mean()  # 按月重采样

6.2 时间操作

df['年'] = df.index.year
df['月'] = df.index.month
df['周'] = df.index.weekofyear
df['季度'] = df.index.quarter

7. 数据可视化

import matplotlib.pyplot as plt
# 线图
df['列名'].plot()
# 柱状图
df['列名'].plot.bar()
# 直方图
df['列名'].plot.hist(bins=20)
# 散点图
df.plot.scatter(x='列1', y='列2')
# 箱线图
df.plot.box()
plt.show()

8. 高级功能

8.1 透视表

pd.pivot_table(df, 
              values='数值列',
              index='行分组列',
              columns='列分组列',
              aggfunc=np.mean)

8.2 数据分箱

# 等宽分箱
pd.cut(df['年龄'], bins=5)
# 等频分箱
pd.qcut(df['年龄'], q=5)

8.3 文本数据处理

df['文本列'].str.upper()       # 大写
df['文本列'].str.lower()       # 小写
df['文本列'].str.len()        # 长度
df['文本列'].str.contains('模式') # 包含
df['文本列'].str.extract(r'正则') # 提取

9. 性能优化

9.1 向量化操作

# 避免循环
df['新列'] = df['列1'] + df['列2']  # 好
df['新列'] = [x+y for x,y in zip(df['列1'], df['列2'])]  # 差

9.2 高效数据类型

df['类别列'] = df['类别列'].astype('category')
df['数值列'] = pd.to_numeric(df['数值列'], downcast='integer')

9.3 大数据处理

# 分块处理
for chunk in pd.read_csv('大文件.csv', chunksize=10000):
    process(chunk)
# 使用Dask
import dask.dataframe as dd
ddf = dd.read_csv('超大文件.csv')
result = ddf.groupby('列名').mean().compute()

10. 实用技巧

10.1 样式设置

# 高亮最大值
def highlight_max(s):
    is_max = s == s.max()
    return ['background-color: yellow' if v else '' for v in is_max]
df.style.apply(highlight_max)

10.2 内存优化

# 查看内存使用
df.memory_usage(deep=True)
# 优化存储
df = df.astype({'列名':'category'})

10.3 多级索引

df = df.set_index(['一级索引','二级索引'])
df.xs('索引值', level='二级索引')

pandas 的功能远不止于此,但掌握了这些核心功能,您就能处理大多数数据分析任务。建议在实践中不断探索 pandas 的更多高级功能。









results matching ""

    No results matching ""