数组方法实现数据透视的核心是组合groupby+agg+unstack或crosstab+reshape,比pivot_table更灵活,适用于自定义分组、多级聚合及转纯数值矩阵场景。

用数组方法实现复杂的数据透视,核心不是绕开pandas去手动写循环,而是理解底层逻辑后,合理组合 groupby + agg + unstack 或 crosstab + reshape 这类“类数组操作”,让数据在索引、列、值之间高效转换。它比直接调用 pivot_table 更灵活,尤其适合需要自定义分组逻辑、多级聚合或结果需转为纯数值矩阵的场景。
用 groupby + unstack 构建结构化透视表
这是最贴近“数组思维”的方式:先按行、列维度分组聚合,再把其中一维“抬升”为列,形成二维结构。
- 指定行维度(index)、列维度(columns)和聚合值(values),用
groupby([行, 列])[值].agg(函数)得到带 MultiIndex 的 Series - 调用
.unstack(列名)把列维度转为列标题,缺失位置自动设为 NaN - 用
.fillna(0)或.astype(int)统一类型,得到干净的 DataFrame
例如:统计每个地区每种产品的销售次数
df.groupby(['region', 'product'])['order_id'].count().unstack('product', fill_value=0)用 crosstab 处理分类计数型透视
当目标是纯粹的“行列交叉频次统计”时,pd.crosstab 是最轻量、最高效的数组式工具,内部基于 numpy 的 bincount 和 reshape 实现。
- 必须传入两个分类变量(index 和 columns),可选 values 和 aggfunc 控制聚合逻辑
-
margins=True一键添加行列小计,等价于 Excel 的“显示总计” - 返回结果是标准 DataFrame,可直接 .values 转为 numpy 数组用于后续计算
例如:生成用户等级 × 活跃状态的交叉频数表
pd.crosstab(df['level'], df['status'], margins=True)用 pivot + aggfunc='first' 实现“取首值”类透视
当原始数据中同一行列组合存在多条记录,且你只需保留某一条(如最早时间、最高分、非空值),pivot 比 pivot_table 更直接——它不默认聚合,但可通过预处理实现精准控制。
- 先用
sort_values排序(如按时间倒序),再drop_duplicates保留每组第一条 - 然后用
.pivot(index, columns, values)直接重塑,无须指定 aggfunc - 适合构建“最新状态快照”“首单信息表”等业务视图
例如:获取每位客户最新一笔订单的金额
df.sort_values('order_time', ascending=False).drop_duplicates('customer_id').pivot('customer_id', 'product_type', 'amount')导出为纯数组用于科学计算
最终结果若要送入模型训练、矩阵运算或绘图,常需剥离索引和列名,转为 numpy.ndarray。
-
df.values获取数值矩阵(忽略 index/columns) -
df.to_numpy()更明确的等价写法,支持 dtype 指定 - 配合
np.nan_to_num()或scipy.sparse.csr_matrix()可进一步压缩稀疏结构
例如:将地区×品类销售额表转为 float32 矩阵供聚类使用
df_pivot.to_numpy(dtype='float32', na_value=0.0)










