You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将矩阵转换为具有唯一值的透视形式?numpy代码未达预期

用Numpy实现带NA填充的透视表

原始数据

用户物品销量
U1I13
U1I24
U3I15
U2I36

目标透视表

I1I2I3
U13NANA
U2NANA6
U35NANA

(注:你提供的目标透视表存在数据错误,比如U2的I2对应4、U3的I3对应6均不符合原始数据,以下代码基于原始数据生成正确的透视表)

你的代码问题

你当前的Numpy代码有三个关键问题:

  • 混合类型数组导致data整体为字符串 dtype,无法使用数值类型的缺失值nan
  • 用np.zeros初始化表会填充"0"字符串,不是需要的NA
  • 未区分标签和数值类型,导致后续赋值逻辑混乱

修正后的代码

import numpy as np

# 拆分数据,分离字符串标签和数值销量
users = np.array(["U1", "U1", "U3", "U2"])
items = np.array(["I1", "I2", "I1", "I3"])
sales = np.array([3, 4, 5, 6], dtype=np.float64)  # 浮点类型才能支持nan缺失值

# 获取唯一行/列标签,同时记录每个原始数据的位置索引
rows, row_pos = np.unique(users, return_inverse=True)
cols, col_pos = np.unique(items, return_inverse=True)

# 初始化透视表,用nan填充所有缺失位置
pivot_table = np.full((len(rows), len(cols)), np.nan)
# 填充对应位置的销量数据
pivot_table[row_pos, col_pos] = sales

# 输出结果
print("行标签(用户):", rows)
print("列标签(物品):", cols)
print("透视表(nan表示缺失):")
print(pivot_table)

补充:转成字符串格式的NA

如果需要把nan显示为字符串"NA",可以添加以下代码:

# 将nan替换为"NA",其他数值转为字符串
pivot_table_str = np.where(np.isnan(pivot_table), "NA", pivot_table.astype(str))
print("\n字符串格式透视表:")
print(pivot_table_str)

可选:保留原始标签顺序

np.unique会自动对标签排序,如果想保留用户/物品第一次出现的原始顺序,替换行/列标签的获取逻辑:

# 保留用户原始顺序的唯一值
rows = np.array(list(dict.fromkeys(users)))
row_pos = np.array([np.argwhere(rows == u)[0][0] for u in users])

# 保留物品原始顺序的唯一值
cols = np.array(list(dict.fromkeys(items)))
col_pos = np.array([np.argwhere(cols == i)[0][0] for i in items])

内容的提问来源于stack exchange,提问作者Navneet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 02:23:12