DataFrame 是 pandas 中最常用的二维表格数据结构,可以看作由多个 Series 组成的列集合,类似 Excel 表格或 SQL 数据表。
2.1 创建
构造方法:pd.DataFrame()
- 从二维 ndarray 创建
- 从字典创建
- 从记录列表(字典/元组列表)创建
- 从结构化数组创建
- 从另一个 DataFrame 创建
from_dict():从字典创建
from_records():从记录列表创建
import pandas as pd
import numpy as np
# 从二维 ndarray 创建
df1 = pd.DataFrame(np.random.randn(3, 4), columns=['A', 'B', 'C', 'D'])
# 从字典创建(每个键是一列)
df2 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
# 从记录列表创建(列表中的每个字典是一行)
df3 = pd.DataFrame([{'A': 1, 'B': 4}, {'A': 2, 'B': 5}])
# 从结构化数组创建
arr = np.array([(1, 'a'), (2, 'b')], dtype=[('num', 'int'), ('str', 'U1')])
df4 = pd.DataFrame(arr)
# 从另一个 DataFrame 创建
df5 = pd.DataFrame(df1)
# 从字典创建(from_dict)
df6 = pd.DataFrame.from_dict({'A': [1, 2], 'B': [3, 4]})
# 从记录列表创建(from_records)
df7 = pd.DataFrame.from_records([(1, 'a'), (2, 'b')], columns=['x', 'y'])
构造参数:
| 参数 | 说明 |
|---|
data | 数据源:二维 ndarray、字典、记录列表、结构化数组、DataFrame |
index | 行索引标签 |
columns | 列名标签 |
dtype | 数据类型(单一类型应用于所有列) |
copy | 是否复制输入数据 |
2.2 属性
| 属性 | 说明 |
|---|
values | 底层 NumPy ndarray |
axes | [index, columns] 列表 |
ndim | 维度(恒为 2) |
shape | 形状 (行数, 列数) |
size | 元素总数(行数 × 列数) |
dtypes | 每列的数据类型 |
index | 行索引 |
columns | 列索引 |
empty | 是否为空 |
attrs | 全局属性字典(自定义元数据) |
flags | 行为标志 |
style | Styler 对象(用于表格样式与格式化) |
df = pd.DataFrame({'A': [1, 2], 'B': [3.0, 4.0]})
df.shape # (2, 2)
df.dtypes # A int64 / B float64
df.ndim # 2
df.values # numpy array
df.columns # Index(['A', 'B'])
2.3 索引与选择
索引方式:
| 方式 | 语法 | 说明 |
|---|
| 列选择 | df['col']、df[['col1','col2']] | 选择单列或多列 |
| 标签索引 | df.loc['row', 'col'] | 按标签选择行和列 |
| 位置索引 | df.iloc[0, 1] | 按位置选择行和列 |
| 快速标量 | df.at['row', 'col'] | 按标签快速取标量 |
| 快速标量 | df.iat[0, 1] | 按位置快速取标量 |
相关方法:
| 方法 | 说明 |
|---|
df.xs(key, axis) | 交叉选择:获取指定标签的行/列(支持 MultiIndex) |
df.get(key) | 获取列,不存在时返回默认值 |
df.where(cond) | 条件为 False 的位置替换为 NaN 或其他值 |
df.mask(cond) | 条件为 True 的位置替换为 NaN 或其他值 |
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['x', 'y', 'z'])
df['A'] # 选择列 A
df.loc['x', 'A'] # 标签定位
df.iloc[0, 0] # 位置定位
df.at['x', 'B'] # 快速标量
df.xs('y') # 获取行 'y'
df.where(df > 3) # 不满足条件的为 NaN
2.4 方法
信息
| 方法 | 说明 |
|---|
head(n) | 前 n 行,默认 5 |
tail(n) | 后 n 行,默认 5 |
sample(n) | 随机抽取 n 行 |
info() | 概括信息:索引、列、非空计数、dtype、内存占用 |
describe() | 数值列的描述性统计 |
memory_usage() | 每列的内存占用 |
转换
| 方法 | 说明 |
|---|
astype(dtype) | 类型转换 |
convert_dtypes() | 自动推断最佳可空类型 |
infer_objects() | 推断 object 类型 |
copy() | 深拷贝 |
索引操作
| 方法 | 说明 |
|---|
set_index(col) | 将指定列设为索引 |
reset_index() | 重置索引为默认 RangeIndex |
reindex(...) | 对齐新索引 |
reindex_like(other) | 按另一个对象的索引对齐 |
rename(...) | 重命名行列标签 |
rename_axis(name) | 重命名轴名称 |
set_axis(labels) | 直接替换轴标签 |
droplevel(level) | 删除多层索引的指定层级 |
swaplevel() | 交换多层索引的两个层级 |
swapaxes(axis1, axis2) | 交换两个轴 |
transpose() / T | 转置(行变列、列变行) |
排序
| 方法 | 说明 |
|---|
sort_index() | 按索引排序 |
sort_values(by=...) | 按指定一列或多列排序 |
rank() | 排名 |
nlargest(n, columns) | 指定列的前 n 大 |
nsmallest(n, columns) | 指定列的前 n 小 |
去重
| 方法 | 说明 |
|---|
duplicated() | 标记重复行 |
drop_duplicates() | 删除重复行 |
缺失值
| 方法 | 说明 |
|---|
isna() | 是否为缺失值 |
isnull() | isna 的别名 |
notna() | 是否非缺失值 |
notnull() | notna 的别名 |
dropna() | 删除缺失行或列 |
fillna(value) | 填充缺失值 |
ffill() | 前向填充 |
bfill() | 后向填充 |
interpolate() | 插值填充 |
replace(old, new) | 替换指定值 |
统计
| 方法 | 说明 |
|---|
count() | 非空数量 |
sum() | 求和 |
mean() | 均值 |
median() | 中位数 |
mode() | 众数 |
std() | 标准差 |
var() | 方差 |
sem() | 标准误差 |
skew() | 偏度 |
kurt() | 峰度 |
min() | 最小值 |
max() | 最大值 |
quantile(q) | 分位数 |
corr() | 相关系数矩阵 |
cov() | 协方差矩阵 |
corrwith(other) | 与另一对象逐列计算相关性 |
autocorr() | 自相关 |
diff() | 差分 |
pct_change() | 百分比变化 |
prod() | 连乘积 |
abs() | 绝对值 |
clip() | 裁剪 |
round() | 四舍五入 |
累积
| 方法 | 说明 |
|---|
cumsum() | 累积和 |
cumprod() | 累积积 |
cummin() | 累积最小值 |
cummax() | 累积最大值 |
函数应用
| 方法 | 说明 |
|---|
apply(func, axis=0) | 沿轴应用函数(默认逐列) |
map(func) | 元素级映射 |
applymap(func) | 对每个元素应用函数 |
pipe(func) | 管道链式调用 |
agg(func) | 聚合操作 |
aggregate(func) | agg 的别名 |
transform(func) | 转换操作,保持形状 |
合并
| 方法 | 说明 |
|---|
merge(right, how=...) | SQL 风格合并 |
join(other, ...) | 基于索引的合并 |
concat(objs, ...) | 拼接(pd 级函数) |
merge_ordered(...) | 有序合并 |
merge_asof(...) | 近似匹配合并 |
combine(other, func) | 元素级合并 |
combine_first(other) | 缺失值用 other 填充 |
update(other) | 用 other 的行列原地更新 |
compare(other) | 逐元素比较,输出差异 |
重塑
| 方法 | 说明 |
|---|
melt() | 宽表转长表 |
pivot() | 长表转宽表 |
pivot_table() | 透视表(支持聚合函数) |
stack() | 列索引转行索引(变长) |
unstack() | 行索引转列索引(变宽) |
explode(col) | 展开列表类型的单元格 |
wide_to_long(...) | 宽格式数据转长格式 |
分组与窗口
| 方法 | 说明 |
|---|
groupby(by=...) | 分组 |
resample(rule) | 时间重采样 |
rolling(window) | 滚动窗口计算 |
expanding() | 扩展窗口计算 |
ewm(...) | 指数加权移动 |
其他
| 方法 | 说明 |
|---|
assign(**kwargs) | 新增列(返回新 DataFrame) |
eval() | 使用字符串表达式高效求值 |
query() | 使用字符串表达式过滤行 |
filter() | 按列名、正则等过滤 |
pop(col) | 弹出(删除并返回)指定列 |
insert(pos, col, value) | 在指定位置插入列 |
drop(labels) | 删除行或列 |
isin(values) | 判断是否属于指定集合 |
between(left, right) | 判断是否在区间内 |
take(indices) | 按位置取行 |
truncate(before, after) | 按索引截断区间 |
align(other) | 将两个对象按索引对齐 |
equals(other) | 判断两个 DataFrame 是否完全相等 |
to_records() | 转为记录数组 |
to_dict() | 转为字典 |
to_numpy() | 转为 NumPy 数组 |
to_markdown() | 转为 Markdown 格式表格 |
to_clipboard() | 复制到剪贴板 |
to_period() | 将时间索引转为 Period 索引 |
to_timestamp() | 将时间索引转为 Timestamp 索引 |
applymap() 在 pandas 2.3 中逐步被 map() 取代,新代码推荐使用 df.map()。
merge 适合按列合并,join 适合按索引合并。
query() / eval() 使用字符串表达式,底层经 NumExpr 加速,性能优于 Python 级循环。