Pandas 速查表
快速参考 Pandas 常用操作和代码片段。
导入和基础
import pandas as pd
import numpy as np
# 查看版本
pd.__version__
数据结构创建
Series
# 从列表
s = pd.Series([1, 2, 3, 4, 5])
# 从字典
s = pd.Series({'a': 1, 'b': 2, 'c': 3})
# 从标量
s = pd.Series(5, index=['a', 'b', 'c'])
# 指定索引
s = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
DataFrame
# 从字典
df = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6]
})
# 从列表字典
df = pd.DataFrame([
{'A': 1, 'B': 4},
{'A': 2, 'B': 5}
])
# 从二维数组
df = pd.DataFrame(
np.random.randn(10, 4),
columns=['A', 'B', 'C', 'D']
)
# 从 CSV/Excel
df = pd.read_csv('file.csv')
df = pd.read_excel('file.xlsx')
数据查看
df.head() # 前5行
df.head(10) # 前10行
df.tail() # 后5行
df.tail(10) # 后10行
df.sample(5) # 随机5行
df.shape # (行数, 列数)
df.dtypes # 数据类型
df.info() # 详细信息
df.describe() # 统计摘要
df.columns # 列名
df.index # 索引
df.values # NumPy数组
数据选择
选择列
df['col'] # 单列(Series)
df[['col1', 'col2']] # 多列(DataFrame)
df.col # 单列(点号访问)
选择行
df.loc['label'] # 按标签
df.loc['start':'end'] # 标签范围
df.iloc[0] # 按位置
df.iloc[0:5] # 位置范围
df.iloc[[0, 2, 4]] # 特定位置
同时选择行列
df.loc['row', 'col'] # 单个元素
df.loc[:, 'col'] # 整列
df.loc['row', :] # 整行
df.loc[:, ['col1', 'col2']] # 多列
df.loc['row1':'row2', 'col1':'col2'] # 区域
条件选择
df[df['col'] > 0] # 单一条件
df[(df['col1'] > 0) & (df['col2'] < 100)] # 多条件(且)
df[(df['col1'] > 0) | (df['col2'] < 100)] # 多条件(或)
df[df['col'].isin(['a', 'b', 'c'])] # 包含
df[df['col'].between(10, 20)] # 范围
df[df['col'].str.contains('text')] # 字符串包含
df.query('col1 > 0 and col2 < 100') # 查询语句
数据清洗
缺失值
# 检测
df.isnull() # 检测缺失值
df.isnull().sum() # 每列缺失值数量
df.notnull() # 检测非缺失值
# 删除
df.dropna() # 删除含缺失值的行
df.dropna(axis=1) # 删除含缺失值的列
df.dropna(how='all') # 删除全为缺失值的行
df.dropna(thresh=2) # 保留至少2个非缺失值的行
# 填充
df.fillna(0) # 用0填充
df.fillna(df.mean()) # 用均值填充
df.fillna(method='ffill') # 前向填充
df.fillna(method='bfill') # 后向填充
df.interpolate() # 插值填充
重复值
df.duplicated() # 检测重复行
df.duplicated().sum() # 重复行数
df.drop_duplicates() # 删除重复行
df.drop_duplicates(subset=['col']) # 基于特定列去重
类型转换
df['col'].astype(int) # 转整数
df['col'].astype(float) # 转浮点数
df['col'].astype(str) # 转字符串
df['col'].astype('category') # 转类别
df['col'] = pd.to_numeric(df['col'], errors='coerce') # 转数值
df['col'] = pd.to_datetime(df['col']) # 转日期
数据转换
应用函数
df['col'].apply(lambda x: x * 2) # Series 应用
df.apply(lambda row: row['A'] + row['B'], axis=1) # 行应用
df.applymap(lambda x: x * 2) # 每个元素
df['col'].map({'a': 1, 'b': 2}) # 映射替换
排序
df.sort_values('col') # 按列升序
df.sort_values('col', ascending=False) # 按列降序
df.sort_values(['col1', 'col2']) # 多列排序
df.sort_index() # 按索引排序
重命名
df.rename(columns={'old': 'new'}) # 重命名列
df.rename(index={'old': 'new'}) # 重命名索引
df.columns = ['a', 'b', 'c'] # 直接赋值列名
数据合并
连接
# concat
pd.concat([df1, df2]) # 纵向拼接
pd.concat([df1, df2], axis=1) # 横向拼接
pd.concat([df1, df2], ignore_index=True) # 重置索引
# 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, left_on='a', right_on='b') # 不同键
# join
df1.join(df2) # 按索引连接
分组聚合
# 分组
df.groupby('col') # 单列分组
df.groupby(['col1', 'col2']) # 多列分组
df.groupby('col')['value'].mean() # 分组求均值
df.groupby('col').agg(['mean', 'sum']) # 多聚合
df.groupby('col').agg({ # 不同列不同聚合
'A': 'mean',
'B': ['min', 'max']
})
# 常用聚合函数
.count() # 计数
.sum() # 求和
.mean() # 均值
.median() # 中位数
.std() # 标准差
.min() # 最小值
.max() # 最大值
.first() # 第一个
.last() # 最后一个
透视表
pd.pivot_table(
df,
values='D',
index='A',
columns='B',
aggfunc='mean',
fill_value=0
)
# 交叉表
pd.crosstab(df['A'], df['B'])
pd.crosstab(df['A'], df['B'], values=df['C'], aggfunc='mean')
时间序列
# 创建日期范围
pd.date_range('2024-01-01', periods=10) # 10天
pd.date_range('2024-01-01', periods=10, freq='M') # 10个月
# 转换
df['date'] = pd.to_datetime(df['date'])
df['date'].dt.year # 提取年
df['date'].dt.month # 提取月
df['date'].dt.day # 提取日
df['date'].dt.dayofweek # 星期几
# 重采样
df.resample('M').mean() # 按月重采样
df.resample('W').sum() # 按周重采样
# 移动窗口
df.rolling(window=7).mean() # 7天移动平均
df.rolling(window=7).std() # 7天移动标准差
# 滞后/超前
df.shift(1) # 滞后1期
df.shift(-1) # 超前1期
df.diff() # 差分
字符串操作
df['col'].str.lower() # 转小写
df['col'].str.upper() # 转大写
df['col'].str.title() # 首字母大写
df['col'].str.strip() # 去除空白
df['col'].str.replace('a', 'b') # 替换
df['col'].str.contains('text') # 包含
df['col'].str.startswith('a') # 开头
df['col'].str.endswith('a') # 结尾
df['col'].str.split(',') # 分割
df['col'].str.len() # 长度
df['col'].str.extract(r'(\d+)') # 正则提取
文件 I/O
读取
pd.read_csv('file.csv')
pd.read_csv('file.csv', encoding='utf-8')
pd.read_csv('file.csv', index_col=0)
pd.read_csv('file.csv', parse_dates=['date'])
pd.read_excel('file.xlsx')
pd.read_excel('file.xlsx', sheet_name='Sheet1')
pd.read_json('file.json')
pd.read_sql('SELECT * FROM table', connection)
保存
df.to_csv('file.csv')
df.to_csv('file.csv', index=False)
df.to_excel('file.xlsx')
df.to_excel('file.xlsx', sheet_name='Sheet1', index=False)
df.to_json('file.json')
df.to_sql('table', connection)
常用属性
df.shape # 形状 (行, 列)
df.dtypes # 数据类型
df.ndim # 维度
df.size # 元素总数
df.T # 转置
df.index # 行索引
df.columns # 列名
df.values # NumPy数组
df.empty # 是否为空
df.memory_usage() # 内存使用
统计函数
df.count() # 非空值计数
df.sum() # 求和
df.mean() # 均值
df.median() # 中位数
df.std() # 标准差
df.var() # 方差
df.min() # 最小值
df.max() # 最大值
df.quantile(0.25) # 分位数
df.cumsum() # 累计和
df.cumprod() # 累计积
df.cummax() # 累计最大
df.cummin() # 累计最小
df.describe() # 描述统计
df.corr() # 相关系数
df.cov() # 协方差
索引操作
# 设置索引
df.set_index('col')
df.set_index(['col1', 'col2'])
# 重置索引
df.reset_index()
df.reset_index(drop=True)
# 重新索引
df.reindex(new_index)
df.reindex(columns=['A', 'B', 'C'])
其他常用操作
# 添加/删除
df['new_col'] = values # 添加列
df.drop('col', axis=1) # 删除列
df.drop(0, axis=0) # 删除行
# 条件赋值
df.loc[df['A'] > 0, 'B'] = 1
# 去重
df.drop_duplicates()
# 抽样
df.sample(n=10)
df.sample(frac=0.1)
# 最大/最小值
df.nlargest(5, 'col')
df.nsmallest(5, 'col')
# 分箱
df['bin'] = pd.cut(df['col'], bins=5)
df['bin'] = pd.qcut(df['col'], q=4)
# 哑变量
dummies = pd.get_dummies(df['col'])
# 因子化
codes, uniques = pd.factorize(df['col'])
性能优化
# 使用类别类型
df['col'] = df['col'].astype('category')
# 分块读取
for chunk in pd.read_csv('large.csv', chunksize=10000):
process(chunk)
# 使用迭代器
for row in df.itertuples():
process(row)
# 向量化操作(避免循环)
df['C'] = df['A'] + df['B'] # 快
df['C'] = df.apply(lambda x: x['A'] + x['B'], axis=1) # 慢
常用快捷键(Jupyter)
# 显示设置
pd.set_option('display.max_rows', 100)
pd.set_option('display.max_columns', 50)
pd.set_option('display.width', 1000)
pd.set_option('display.precision', 2)
# 重置选项
pd.reset_option('display.max_rows')
# 查看所有选项
pd.describe_option()
提示:将此速查表收藏,方便快速查找常用代码!