复杂的熊猫融化

时间:2021-04-17 19:32:48

标签: python pandas dataframe pandas-groupby pandas-melt

我有一个复杂的熔化函数需要做。我试过逐步完成并检查其他问题,但我很卡!

这是我当前的数据框:

         1   2   4   5   6   10   24
Userid

u_A      0   1   3   0   0    0    5
u_B      0   0   0   0   0    0    1

我需要解决这个问题:

Userid    Movieid    Rating
u_A          2         1
u_A          4         3
u_A          24        5
u_B          24        1

因此,澄清一下,删除 0 值评级并将每个评级放在单独的行中,可由用户 ID 访问。我知道列轴通常也有一个名称(在这种情况下,是顶部的那个系列),但我在处理过程中以某种方式设法丢失了它。

我得到的最接近的是语句 fold_1_df.melt(var_name=' movie_id', value_name=' rating') 但格式仍然不完整

3 个答案:

答案 0 :(得分:1)

您可以.reset_index(),再次融化并设置索引。然后通过 rating:

过滤数据框
x = (
    df.reset_index()
    .melt(id_vars="Userid", var_name="movie_id", value_name="rating")
    .set_index("Userid")
)
print(x[x["rating"] > 0])

打印:

       movie_id  rating
Userid                 
u_A           2       1
u_A           4       3
u_A          24       5
u_B          24       1

答案 1 :(得分:1)

此时我找到了一种解决方法,如下所示:

fold_1_df = fold_1_df.melt(ignore_index = False,var_name=' movie_id', value_name=' rating') 
fold_1_df[fold_1_df[' rating'] != 0]

答案 2 :(得分:0)

您可以将 0 替换为 NaN,然后使用 df.stack()

df.rename_axis("movie_id", axis=1).replace(0, np.nan).stack().reset_index(
    name="rating"
)

  Userid movie_id  rating
0    u_A        2     1.0
1    u_A        4     3.0
2    u_A       24     5.0
3    u_B       24     1.0