Pandas 手册

基本元素介绍

心智模型

  • Index:坐标轴标签,用于 Series 和 DataFrame 的定位
  • Series:values + Index
  • DataFrame:2D values + 行 Index + 列 Index;或者把每一列理解为共享 Index 的 Series

DatetimeIndex

首先介绍 Panda 中时间相关的类:

  • Timestamp:时间戳/时间点
  • Timedelta:Duration
  • Period:比如 pd.Period("2026-09", freq="M") 表示整个九月,代表时间段

Timestamp

1
2
3
4
5
6
import pandas as pd

t = pd.Timestamp("2026-09-05 09:31:00")

# 可以直接取时间字段
t.year; t.month; t.day; t.hour; t.minute; t.second; t.dayofweek; t.dayofyear

本质上,pandas / NumPy 通常把 datetime 存成 datetime64[ns],底层可以近似理解成一个 int64,也就是距离 1970-01-01 00:00:00 的纳秒数。

创建 DatetimeIndex

1
2
3
4
5
6
7
8
9
# 法一
s = [
"2026-09-01 09:31",
"2026-09-01 09:32",
]
idx = pd.to_datetime(s)

# 法二
idx = pd.date_range( start="2026-09-01", end="2026-09-05", freq="D", )

时间切片

1
2
# df 的索引是 DatetimeIndex, 精确到秒
df.loc["2026-09-01"] # 取这个日期的所有数据

选择数据

变换数据

groupby

这个单拎出来记。

比如有这样一个DataFrame df:

1
2
3
4
5
6
  product  quantity
0 A 2
1 B 1
2 A 3
3 B 4
4 C 5

那么 grouped = df.groupby('product') 的类型是 DataFrameGroupBy,逻辑上可以当作是元组列表

1
2
3
4
[
('A', DataFrame),
('B', DataFrame)
]

Groupby 对象索引取值

可以索引取值 grouped['quantity'],相当于对上面元组列表中每个组中的 DataFrame 统一做一次索引取值。此时类型变为 SeriesGroupBy,若索引是列表,则仍是 DataFrameGroupBy。

查看 Groupby 对象

可以用以下方式看各个 group:

1
2
3
for name, frame in grouped:
pritn(name)
display(frame)

聚合操作

对于 GroupBy 对象,常见操作是聚合。聚合函数包括 .max(),.min(),.first(),.mean(),.sum() 等。

对于 DataFrameGroupBy 对象,可以对不同的列指定不同的聚合函数,此时用 .agg({'column1':''mean', 'column2': np.sum, 'column3':lambda x:x.min()}) 这样的写法,字典的值可传函数名字符串或者函数。

注意聚合操作中,by列会自动退出计算,形成聚合后的 DataFrame 的 index。

时间索引 df 的 groupby

统计信息

df.info()

结构与元数据摘要,几行几列,类型,缺失值数量;直接打印,返回值为 None

df.describe()

默认统计数值列的分布信息:均值、标准差、分位数。

传入参数 include='all' 会统计所有类型的列的信息,非数值列统计 unique,freq 等。

sr.value_counts()

统计 Series 的数值频数,返回字典。


Series

Series-to-Series Operations

1
2
3
4
5
6
7
8
9
# 保留2位小数
s.round(2)

# 类型转换
s.astype(int)
pd.to_datetime(s)

# s1 中的元素是否在 s2 中,返回与 s1 同形状的 Series
s1.isin(s2)

Series-to-Other Operations

1
2
3
4
# 给 Series 分桶,贴标签
# bins 一般是列表,例如 [1,2,3]
# 默认左开右闭,以上面的 bins 为例,桶就是 (1,2],(2.3]
pd.cut(x, bins, right=True, labels=None,)

DataFrame

其他

对 DataFrame 的方法/属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import pandas as pd

# 根据指定列给 DataFrame 排序,默认升序,即第一行最小
df.sort_values(by, *, axis=0, ascending=True)

# 不能用 and
mask = df['A'] > 0 & df['B'] < 3

# 设置 index ,keys 传 array-like object,默认返回一个新的 DataFrame 而不是修改原来的
df.set_index(keys, *, inplace = False)

# 表连接,默认做内连接
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False)

# 长表转宽表,给定 (indice, column) , 对应的 value 不能重复,否则报错
# index, columns, values 可以传列表,返回多重列索引的 df
df.pivot(*, columns, index=<no_default>, values=<no_default>)

# 长表转宽表,给定 (indice, column),对应的 value 可以重复,做聚合,默认取平均值
df.pivot_table(values=None, index=None, columns=None, aggfunc='mean')

# 传入字典,更改指定列名/行名
df.rename(index=None, columns=None)

# 返回 mask,形状跟原 DataFrame 一样
df.isna()

# 去除含有缺失值的行/列,默认去除行
df.dropna(*, axis=0)

# 把缺失值全部填为 0
df.fillna(0)

# 去除行/列,返回 copy。建议直接写 df.drop(columns=labels) 或 df.drop(index=labels)
df.drop(labels=None, *, axis=0, index=None, columns=None, inplace = False)
1
2
3
# index 和 columns 分别传入一个 Series,计数,给出列联表
# 传入 values 时需要指定 aggfunc,此时行为类似 df.pivot()
pd.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None)

底层学习

pivot 的底层实现

这里只考虑 index、columns 和 values 都传单值的情形。

考虑如下 DataFrame:

1
2
3
4
5
  user  day  value
0 A Mon 10
1 B Mon 30
2 A Tue 20
3 B Tue 40

执行 df.pivot(index='user', columns='day', values='value'),首先会把 user 和 day 两列拼成 MultiIndex,然后把 value 列贴上去,组成 Series,注意顺序是不变的:

1
2
3
4
5
index  value
('A', 'Mon') 10
('B', 'Mon') 30
('A', 'Tue') 20
('B', 'Tue') 40

换成这种形式有什么差别呢?主要差别在于,MultiIndex 会被编码成 levels + codes 。会有这样的映射:

1
2
3
4
5
'A': 0
'B': 1

'Mon': 0
'Tue': 1

这实际上就给出宽表的坐标了,后续会构造 2×22\times 2 的宽表,按 MultiIndex 隐喻的坐标填数。


Pandas 手册
https://wtx17.github.io/2026/09/05/Pandas 手册/
作者
wtx
发布于
2026年9月5日
更新于
2026年11月6日
许可协议