如何删除单列中的小数?

时间:2019-02-10 09:19:11

标签: python python-3.x pandas dataframe jupyter-notebook

我正在尝试在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”列)使用小数? 以及如何正确地进行修复(不仅要删除该列中的小数,还要像其他列一样按预期进行修复)。

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