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行为标志
styleStyler 对象(用于表格样式与格式化)
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 级循环。