如何将高维数据框由长到宽reshape,用于后续的降维+可视化?

问题描述

我有一个类似于以下内容的数据框:

如下所示:

索引 属性 得分
user_1 0.144228
user_1 b 0.980685
user_1 c 0.165716
user_2 0.795340
user_2 b 0.903498
user_3 d 0.193492
user_3 e 0.900509

这是可重现的代码

df = pd.DataFrame({'index':['user_1','user_1','user_2','user_3','user_3'],'attribute':['a','b','c','a','d','e'],'score':[random.rand(),random.rand(),random.rand()]})


df.set_index('index',inplace=True)

我想取消堆叠/旋转此表,以便属性值成为列标题,如下所示:

enter image description here

现在,这相当容易,除了我有 350K 维度,并且从上面的示例中可以看出,并非每个用户都有每个维度的分数

我尝试过使用标准的 Pandas pd.pivot_table().unstack() 函数,但是当我尝试这样做时,我的内核总是死掉。我随后尝试使用 dask 这样做,通过

输出保存到 csv
dask.dataframe.reshape.pivot_table(df,index='index',columns='attribute',values='score').to_csv('df.csv')

但它也崩溃了,产生了以下错误

KilledWorker: ("('pivot_table_count-chunk-c31649485f27d5f8670393d66e2d14ac',3,0)",<Worker 'tcp://127.0.0.1:56298',name: 0,memory: 0,processing: 5>)

我现在不知所措。如何重塑高维数据集以进行后续的降维、聚类和可视化?

解决方法

df.pivot(index='index',columns='attribute').reset_index().droplevel(0,axis=1)


           attribute    a         b         c         d         e
0          user_1  0.144228  0.980685  0.165716       NaN       NaN
1          user_2  0.795340  0.903498       NaN       NaN       NaN
2          user_3       NaN       NaN       NaN  0.193492  0.900509