python - 按两列分组并使用第三列作为值而不使用 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)
解决方案
尝试使用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
推荐阅读
- docker - 在 Mac 上使用 docker compose 从 docker 容器内连接到 Internet
- redis - Redis 速率限制器模式
- angular - 在扩展面板中使用 *ngFor 显示数据
- javascript - 在 chrome 中使用 javascript 设置 SVG 属性
- hadoop - 错误找不到键 log4j.appender.RFA 的值
- delphi - 如何在画布上移动两个位图图像
- javascript - Charts.js 如何拥有 2 个不同大小的 y 轴
- batch-file - 如何批量验证字符串是有效的 IPv4 或 IPv6 地址?
- fiware - 通知 Quantumleap 时如何定义使用哪个 time_index 属性?
- html - 如何在 Python 中使用 Selenium Webdriver 提取 webelement