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 解决方案吗?
魔法来自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)