
本文介绍两种高效方法:使用 pivot_table 或 value_counts().unstack(),将用户-行为数据转换为“用户×页面”的计数矩阵,并自动填充缺失值为 0。
本文介绍两种高效方法:使用 `pivot_table` 或 `value_counts().unstack()`,将用户-行为数据转换为“用户×页面”的计数矩阵,并自动填充缺失值为 0。
在数据分析中,常需将长格式的用户行为日志(如用户 ID 与页面访问记录)转换为宽格式的交叉频数表,便于后续分析或可视化。例如,给定如下 DataFrame:
import pandas as pd
data = {
"User": ["AA", "AA", "AA", "BB", "BB", "CC", "CC"],
"Action": ["Page1", "Page1", "Page2", "Page2", "Page3", "Page3", "Page3"],
}
df = pd.DataFrame(data)
目标是得到每个用户对各页面(Page1/Page2/Page3)的访问次数,缺失组合记为 0,结果形如:
User Page1 Page2 Page3 0 AA 2 1 0 1 BB 0 1 1 2 CC 0 0 2
✅ 推荐方法一:pivot_table(语义清晰、灵活可控)
result = df.pivot_table(
index="User",
columns="Action",
fill_value=0,
aggfunc=len
).reset_index()
-
index="User":以User为行索引; -
columns="Action":以Action值(如Page1)为列名; -
aggfunc=len:对每组(User, Action)计数(等价于count,但更明确); -
fill_value=0:自动将未出现的组合(如BB-Page1)补零; -
.reset_index():将User从索引转为普通列,符合常规 DataFrame 结构。
? 提示:若需支持多级聚合(如同时统计均值、最大值),
pivot_table是唯一选择。
✅ 推荐方法二:value_counts().unstack()(简洁高效)
result = df.value_counts().unstack(fill_value=0).reset_index()
-
df.value_counts()返回MultiIndex Series(索引为(User, Action),值为频次); -
.unstack(fill_value=0)将第二级索引(Action)转为列,并用0填充空缺; -
.reset_index()恢复User为普通列。
该写法代码极简,性能优异,适用于纯计数场景。
⚠️ 注意事项
- 列名默认为
Action的唯一值(如'Page1','Page2'),无需手动指定; - 若
Action中存在空值(NaN),pivot_table默认忽略,而value_counts()默认排除NaN—— 如需保留,需提前处理; - 输出列顺序按
Action字典序排列;如需自定义顺序,可在unstack()后用reindex(columns=[...])调整; - 若原始数据含重复索引(如
(AA, Page1)出现多次),两种方法均正确累加计数,无需去重。
✅ 最终验证
print(result) # User Page1 Page2 Page3 # 0 AA 2 1 0 # 1 BB 0 1 1 # 2 CC 0 0 2
两种方法均可直接用于 EDA、特征工程或导出报表。对于初学者,建议优先使用 pivot_table 以增强可读性与可维护性;追求简洁与性能时,value_counts().unstack() 是更优雅的选择。










