让我们有评级和书籍表。
RATINGS
User-ID ISBN Book-Rating
244662 0373630689 7
19378 0812515595 10
238625 0441892604 9
180315 0140439072 0
242471 3548248950 0
BOOKS
ISBN Book-Title Book-Author Year-Of-Publication Publisher
0393000753 A Reckoning May Sarton 1981 W W Norton
由于许多书籍都有相同的名称和作者,但出版商和出版年份不同,我想按标题对它们进行分组,并将评级表中的ISBN替换为该组第一行的ISBN。
更具体地说,如果分组看起来像这样
Book-Name ISBN
Name1 A
B
C
Name2 D
E
Name3 F
G
和等级
User-ID ISBN Book-Rating
X B 3
X E 6
Y D 1
Z F 8
我希望评分看起来像
User-ID ISBN Book-Rating
X A 3
X D 6
Y D 1
Z G 8
以节省pivot_table所需的内存。数据集可以找到here。
我的尝试是按照
的方式进行的book_rating_view = ratings.merge(books, how='left', on='ISBN').groupby(['Book-Title'])['ISBN']
ratings['ISBN'].replace(ratings['ISBN'], pd.Series([book_rating_view.get_group(key).min() for key,_ in book_rating_view]))
似乎不起作用。另一种尝试是将pivot_table直接构造为
isbn_vector = books.groupby(['Book-Title']).first()
utility = pd.DataFrame(0, index=explicit_ratings['User-ID'], columns=users['User-ID'])
for name, group in explicit_ratings.groupby('User-ID'):
user_vector = pd.DataFrame(0, index=isbn_vector, columns = [name])
for row, index in group:
user_vector[books.groupby(['Book-Title']).get_group(row['ISBN']).first()] = row['Book-Rating']
utility.join(user_vector)
导致MemoryError,即使缩减表应该适合内存。
感谢您的任何建议!
答案 0 :(得分:0)
我希望你向我们展示更多的BOOK数据框架,并且最需要输出,但下面怎么样? (即使我通常也不建议将数据存储在数据框中作为列表...)
说df1 = RATINGS
,df2 = BOOKS
,
dfm = df2.merge(df1, on='ISBN').groupby('Book-Title').apply(list)
dfm['Book-Rating'] = dfm['Book-Rating'].map(sum)