使用不同表

时间:2017-07-20 23:22:59

标签: python pandas

让我们有评级和书籍表。

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,即使缩减表应该适合内存。

感谢您的任何建议!

1 个答案:

答案 0 :(得分:0)

我希望你向我们展示更多的BOOK数据框架,并且最需要输出,但下面怎么样? (即使我通常也不建议将数据存储在数据框中作为列表...)

df1 = RATINGSdf2 = BOOKS

dfm = df2.merge(df1, on='ISBN').groupby('Book-Title').apply(list)
dfm['Book-Rating'] = dfm['Book-Rating'].map(sum)