如何将矩阵转换为具有唯一值的透视形式?numpy代码未达预期
用Numpy实现带NA填充的透视表
原始数据
| 用户 | 物品 | 销量 |
|---|---|---|
| U1 | I1 | 3 |
| U1 | I2 | 4 |
| U3 | I1 | 5 |
| U2 | I3 | 6 |
目标透视表
| I1 | I2 | I3 | |
|---|---|---|---|
| U1 | 3 | NA | NA |
| U2 | NA | NA | 6 |
| U3 | 5 | NA | NA |
(注:你提供的目标透视表存在数据错误,比如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
相关产品推荐
相关产品推荐

