复杂的Pandas Melt

3

我有一个复杂的熔断函数需要实现。我试图逐步调试并查看其他问题,但我很困惑!

以下是我的当前数据框:

         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个回答

1
您可以使用.reset_index(),将数据框进行melt操作并重新设置索引。然后,按照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

我目前找到了一个解决方法,看起来是这样的:

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]

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接