Я думаю, что проблема заключается в смешивании числовых значений с нечисловыми 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