首页 > 解决方案 > 按两列分组并使用第三列作为值而不使用 pivot_table

问题描述

我有以下数据框。


     user  movie rating                                                                 
0      1   1     3

1      1   2     4

2      2   1     2

3      2   2     5

4      3   1     3

我想要的输出是


movie  1   2 
user                                                                   
1      3   4 

2      2   5  

3      3   0  

如果用户没有给电影评分,我需要在相应的输出列中有“0”,否则,评分值应该存在。

注意:我可以使用 pivot_table 实现这一点,但问题是我的数据集包含超过 100000 列,因此我得到“Unstacked DataFrame 太大,导致 int32 溢出”。我正在尝试 groupby 作为绕过此错误的替代方法。

我正在尝试以下操作,但它不包括我的数据框的“值”列中的值。

df.groupby(['user', 'movie']).size().unstack('movie', fill_value=0)

标签: pythonpandasgroup-by

解决方案


尝试使用crosstab

pd.crosstab(df.user, df.movie, values = df.rating, aggfunc = 'first').fillna(0)
# movie    1    2
# user           
# 1      3.0  4.0
# 2      2.0  5.0
# 3      3.0  0.0

要获得整数值,只需使用.astype(int),如下所示:

pd.crosstab(df.user, df.movie, values = df.rating, aggfunc = 'first').fillna(0).astype(int)
# movie  1  2 
# user          
# 1      3  4
# 2      2  5
# 3      3  0

推荐阅读