Pandas 是 Python 中一个强大的开源数据分析和操作库,特别适合处理表格数据和时间序列数据。下面我将从基础到高级详细介绍 Pandas 的主要功能。
1. Pandas 核心数据结构 #
Pandas 有两个主要数据结构:
1.1 Series #
Series 是一维带标签的数组,可以存储任何数据类型。
# 导入 pandas 和 numpy 库
import pandas as pd
import numpy as np
# 创建 Series
# 创建一个包含整数和缺失值的 Series
s = pd.Series([1, 3, 5, np.nan, 6, 8])
# 打印 Series
print(s)
# 带自定义索引
# 创建一个带有自定义索引的 Series
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
# 打印带索引的 Series
print(s)1.2 DataFrame #
DataFrame 是二维的、大小可变的、潜在的异构的表格数据结构。
# 导入 pandas 和 numpy 库
import pandas as pd
import numpy as np
# 创建 DataFrame
# 创建一个包含多种数据类型的 DataFrame
# 'A' 列为浮点数,'B' 列为时间戳,'C' 列为 float32,'D' 列为 int32,'E' 列为分类,'F' 列为字符串
df = pd.DataFrame({
'A': 1., # 浮点数
'B': pd.Timestamp('20230101'), # 时间戳
'C': pd.Series(1, index=list(range(4)), dtype='float32'), # float32 类型的 Series
'D': np.array([3] * 4, dtype='int32'), # int32 类型的 numpy 数组
'E': pd.Categorical(["test", "train", "test", "train"]), # 分类数据
'F': 'foo' # 字符串
})
# 打印 DataFrame
print(df)2. 数据读取与写入 #
Pandas 支持多种文件格式:
# 导入 pandas 库
import pandas as pd
# 读取 CSV
# 从本地文件读取 CSV 文件,文件名为 'file.csv'
df = pd.read_csv('file.csv')
# 读取 Excel
# 从本地 Excel 文件读取数据,文件名为 'file.xlsx',读取名为 'Sheet1' 的工作表
df = pd.read_excel('file.xlsx', sheet_name='Sheet1')
# 读取 SQL
# 导入 sqlite3 库
import sqlite3
# 连接到本地 SQLite 数据库,数据库文件名为 'database.db'
conn = sqlite3.connect('database.db')
# 执行 SQL 查询并读取结果到 DataFrame
df = pd.read_sql('SELECT * FROM table_name', conn)
# 写入文件
# 将 DataFrame 写入 CSV 文件,不包含索引
df.to_csv('output.csv', index=False)
# 将 DataFrame 写入 Excel 文件
df.to_excel('output.xlsx')3. 数据查看与检查 #
# 查看前几行
# 显示 DataFrame 的前 5 行
df.head()
# 查看后几行
# 显示 DataFrame 的后 5 行
df.tail()
# 查看索引
# 获取 DataFrame 的索引对象
df.index
# 查看列名
# 获取 DataFrame 的所有列名
df.columns
# 查看统计摘要
# 显示数值型数据的统计摘要
df.describe()
# 查看数据类型
# 显示每一列的数据类型
df.dtypes
# 查看数据形状
# 显示 DataFrame 的行数和列数
df.shape
# 查看缺失值
# 统计每一列的缺失值数量
df.isnull().sum()4. 数据选择与过滤 #
4.1 选择列 #
# 选择单列
# 选择名为 'column_name' 的列
df['column_name']
# 选择多列
# 选择名为 'col1' 和 'col2' 的两列
df[['col1', 'col2']]4.2 选择行 #
# 通过索引标签
# 通过标签选择索引为 'index_label' 的行
df.loc['index_label']
# 通过位置
# 选择第一行
df.iloc[0]
# 选择前 5 行
df.iloc[0:5]
# 布尔索引
# 选择 'column' 列大于 0.5 的所有行
df[df['column'] > 0.5]4.3 混合选择 #
# 选择特定行和列
# 通过标签选择多行多列
df.loc[['row1', 'row2'], ['col1', 'col2']]
# 通过位置选择多行多列
df.iloc[0:2, 0:2]5. 数据处理 #
5.1 缺失值处理 #
# 删除缺失值
# 删除包含缺失值的行
df.dropna()
# 填充缺失值
# 用 0 填充所有缺失值
df.fillna(value=0)
# 用前一个非缺失值填充缺失值
df.fillna(method='ffill')5.2 数据转换 #
# 应用函数
# 对 'column' 列的每个元素乘以 2
df['column'].apply(lambda x: x * 2)
# 替换值
# 将 'old_value' 替换为 'new_value'
df.replace({'old_value': 'new_value'})
# 重命名列
# 将 'old_name' 列重命名为 'new_name'
df.rename(columns={'old_name': 'new_name'})
# 类型转换
# 将 'column' 列的数据类型转换为 float
df['column'].astype('float')5.3 排序 #
# 按值排序
# 按 'column' 列的值进行排序
df.sort_values(by='column')
# 按索引排序
# 按索引进行排序
df.sort_index()6. 数据分组与聚合 #
# 分组
# 按 'column' 列进行分组
grouped = df.groupby('column')
# 聚合
# 对分组后的数据进行求和、均值和计数
grouped.agg(['sum', 'mean', 'count'])
# 多重聚合
# 按 'col1' 和 'col2' 分组,对 'col3' 求和,对 'col4' 求均值
df.groupby(['col1', 'col2']).agg({'col3': 'sum', 'col4': 'mean'})7. 数据合并与连接 #
# 连接
# 纵向连接两个 DataFrame
pd.concat([df1, df2])
# 合并
# 按照 'key_column' 列进行合并
pd.merge(df1, df2, on='key_column')
# 连接
# 按索引左连接两个 DataFrame
df1.join(df2, how='left')8. 时间序列处理 #
# 导入 pandas 和 numpy 库
import pandas as pd
import numpy as np
# 创建时间序列
# 生成从 2023-01-01 开始的 6 天日期序列
dates = pd.date_range('20230101', periods=6)
# 时间作为索引
# 创建一个以日期为索引、包含 4 列随机数的 DataFrame
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
# 重采样
# 按月重采样并计算均值
df.resample('M').mean()
# 移动窗口
# 计算 3 行的滑动平均值
df.rolling(window=3).mean()9. 性能优化技巧 #
# 使用矢量化操作代替循环
# 直接对两列相加,生成新列 'new_col'
df['new_col'] = df['col1'] + df['col2']
# 使用 eval() 进行表达式求值
# 用 eval 方法直接在 DataFrame 内部进行列运算
df.eval('new_col = col1 + col2', inplace=True)
# 使用 query() 进行查询
# 用 query 方法筛选 'col1' 大于 'col2' 的行
df.query('col1 > col2')
# 使用类别数据类型节省内存
# 将 'category_col' 列转换为类别类型
df['category_col'] = df['category_col'].astype('category')10. 可视化 #
Pandas 集成了 Matplotlib 的绘图功能:
# 导入 pandas 和 matplotlib 库
import pandas as pd
import matplotlib.pyplot as plt
# 假设已有 DataFrame df
# 画线图
df.plot()
plt.show()
# 画柱状图
df.plot.bar()
plt.show()
# 画直方图
df.plot.hist()
plt.show()
# 画散点图
df.plot.scatter(x='col1', y='col2')
plt.show()
# 画箱线图
df.plot.box()
plt.show()