问题描述
如下所示:
索引 | 属性 | 得分 |
---|---|---|
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)
现在,这相当容易,除了我有 350K 维度,并且从上面的示例中可以看出,并非每个用户都有每个维度的分数。
我尝试过使用标准的 Pandas pd.pivot_table()
和 .unstack()
函数,但是当我尝试这样做时,我的内核总是死掉。我随后尝试使用 dask 这样做,通过
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