Pandas dataframe:将列转换为单列的行

Nik*_*Nik 2 python pivot-table dataframe pandas

我有一个看起来像的数据框

userId  feature1  feature2  feature3  ...
123456  0         0.45      0         ...
234567  0         0         0         ...
345678  0.6       0         0.2       ...
.
.
Run Code Online (Sandbox Code Playgroud)

这些特征大部分为零,但有时其中一些特征会具有非零值。userId 的单行可以具有零个、一个或多个非零特征。

我想将其转换为以下数据集:

userId  feature  value
123456  feature2 0.45
345678  feature1 0.6
345678  feature3 0.2
Run Code Online (Sandbox Code Playgroud)

本质上,我们只保留每个 userId 的非零特征。因此,对于 userId 345678,转换后的数据集中有 2 行,一行用于特征 1,另一行用于特征 3。userId 234567 已被删除,因为所有功能均不为零。

这是可以使用 groupby 或透视来完成的事情吗?如果是这样,怎么办?

还有其他 pandas-mic 解决方案吗?

WeN*_*Ben 5

魔法来自melt

df.melt('userId').query('value!=0')
Out[459]: 
   userId  variable  value
2  345678  feature1   0.60
3  123456  feature2   0.45
8  345678  feature3   0.20
Run Code Online (Sandbox Code Playgroud)

请注意,使用时stack需要掩码 0NaN

df.mask(df.eq(0)).set_index('userId').stack().reset_index()
Out[460]: 
   userId   level_1     0
0  123456  feature2  0.45
1  345678  feature1  0.60
2  345678  feature3  0.20
Run Code Online (Sandbox Code Playgroud)