我正在尝试在DataFrame中将列转换为行,并将行转换为列。
user_id movie_id rating
32236 1 1 5
23171 1 2 3
83307 1 3 4
62631 1 4 3
47638 1 5 3
26184 2 1 4
1333 5 1 4
172 5 2 3
54487 6 1 4
52430 7 4 5
18504 10 1 4
4617 10 4 4
44328 12 4 5
30881 13 1 3
4470 13 2 3
21009 13 4 5
39066 13 5 1
接下来我做了:
df = ratings.pivot_table(index=['movie_id'], columns='user_id', values='rating', fill_value='').rename_axis(None, axis=1).reset_index()
df
这就是我得到的:
movie_id 1 2 5 6 7 10 12 13
0 1 5.0 4 4 4 4 3
1 2 3.0 3 3
2 3 4.0
3 4 3.0 5 4 5 5
4 5 3.0 1
问题是原始值不是小数,为什么排名的第一列(“ 1”列)使用小数? 以及如何正确地进行修复(不仅要删除该列中的小数,还要像其他列一样按预期进行修复)。
答案 0 :(得分:1)
我认为问题在于将数值与非数字fill_value=''
混合在一起,然后浮点数显示为整数:
df1 = ratings.pivot_table(index='movie_id', columns='user_id', values='rating', fill_value='')
print (df1)
user_id 1 2 5 6 7 10 12 13
movie_id
1 5.0 4 4 4 4 3
2 3.0 3 3
3 4.0
4 3.0 5 4 5 5
5 3.0 1
print (df1.applymap(type))
user_id 1 2 5 6 \
movie_id
1 <class 'float'> <class 'float'> <class 'float'> <class 'float'>
2 <class 'float'> <class 'str'> <class 'float'> <class 'str'>
3 <class 'float'> <class 'str'> <class 'str'> <class 'str'>
4 <class 'float'> <class 'str'> <class 'str'> <class 'str'>
5 <class 'float'> <class 'str'> <class 'str'> <class 'str'>
user_id 7 10 12 13
movie_id
1 <class 'str'> <class 'float'> <class 'str'> <class 'float'>
2 <class 'str'> <class 'str'> <class 'str'> <class 'float'>
3 <class 'str'> <class 'str'> <class 'str'> <class 'str'>
4 <class 'float'> <class 'float'> <class 'float'> <class 'float'>
5 <class 'str'> <class 'str'> <class 'str'> <class 'float'>
如果使用数字fill_value=0
,则效果很好:
df = ratings.pivot_table(index='movie_id', columns='user_id', values='rating', fill_value=0)
print (df)
user_id 1 2 5 6 7 10 12 13
movie_id
1 5 4 4 4 0 4 0 3
2 3 0 3 0 0 0 0 3
3 4 0 0 0 0 0 0 0
4 3 0 0 0 5 4 5 5
5 3 0 0 0 0 0 0 1
如果值不是必需的聚合,只需要先进行透视就可以转换为字符串,然后替换缺少的值:
ratings['rating'] = ratings['rating'].astype(str)
df = ratings.pivot(index='movie_id', columns='user_id', values='rating').fillna('')
print (df)
user_id 1 2 5 6 7 10 12 13
movie_id
1 5 4 4 4 4 3
2 3 3 3
3 4
4 3 5 4 5 5
5 3 1