按两列分组,然后将第三列用作值-pandas

时间:2019-07-28 13:01:11

标签: python pandas group-by

我有以下数据框。


     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  3
user                                                                   
1      3   4  0

2      2   5  0

3      3   0  0

如果用户未对电影评分,则需要在相应的输出列中输入“ 0”,否则应显示评分值。

注意:我能够使用pivot_table实现此目的,但是要注意的是我的数据集包含超过100000列,因此我得到“ Unstacked DataFrame太大,导致int32溢出”。我正在尝试使用groupby来绕过此错误。

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

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

2 个答案:

答案 0 :(得分:1)

尝试使用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

答案 1 :(得分:0)

我不确定您为什么会期待电影3,因为原始数据样本中不存在电影movie_ratings.set_index(['user', 'movie']).unstack('movie', fill_value=0),但对于您而言,这会起作用: import React, { Component } from 'react' import ReactPDF, { Page, Text, View, Document, StyleSheet , Font, Image,} from '@react-pdf/renderer'; import pic from "../pics/pic.jpeg" // Create styles const styles = StyleSheet.create({ page: { flexDirection: 'row', backgroundColor: '#fff', width:"100%", orientation:"portrait" }, image: { width: '100%', height:"100%", padding: 10, backgroundColor: 'white', }, }); // Create Document Component export default class ImageToPDF extends Component { render() { return ( <Document > <Page object-fit="fill" style={styles.page} size="A4"> <View object-fit="fill" style={styles.image}> <Image object-fit="fill" style={{ padding:"0, 0, 0, 0", margin:"33%, 2rem, 2rem, 2rem", transform: 'rotate(90deg)'}} src={pic} alt="images" /> </View> </Page> </Document> ) } }