2016-06-01 10 views
3

Я пытаюсь создать систему рекомендаций, основанных на элементах, из набора данных yelp. Мне удалось обработать данные до такой степени, что у меня есть рейтинги, данные всеми пользователями, которые рассматривали ресторан в определенном состоянии. В конце концов я хочу дойти до того, что у меня есть рейтинговая матрица с ресторанами на одной оси, а пользователи - с другой, и рейтинги (1-5) посередине (ноль для отсутствующих отзывов).Переупорядочить рамку данных pandas, чтобы создать матрицу оценок 2d

Сейчас DF выглядит следующим образом:

   user_id    review_id    business_id stars 
0 Xqd0DzHaiyRqVH3WRG7 15SdjuK7DmYqUAj6rjGowg vcNAWiLM4dR7D2nwwJ7nCA  5 
1 Xqd0DzHaiyRqVH3WRG7 15SdjuK7DmYqUAj6rjGowg vcNAWiLM4dR7D2nwwJ7nCA  5 
2 H1kH6QZV7Le4zqTRNxo RF6UnRTtG7tWMcrO2GEoAg vcNAWiLM4dR7D2nwwJ7nCA  2 
3 zvJCcrpm2yOZrxKffwG -TsVN230RCkLYKBeLsuz7A vcNAWiLM4dR7D2nwwJ7nCA  4 
4 KBLW4wJA_fwoWmMhiHR dNocEAyUucjT371NNND41Q vcNAWiLM4dR7D2nwwJ7nCA  4 
5 zvJCcrpm2yOZrxKffwG ebcN2aqmNUuYNoyvQErgnA vcNAWiLM4dR7D2nwwJ7nCA  4 
6 Qrs3EICADUKNFoUq2iH _ePLBPrkrf4bhyiKWEn4Qg vcNAWiLM4dR7D2nwwJ7nCA  1 

, но я хотел бы, чтобы она выглядела немного больше, как это:

(4 ресторана х 5 пользователей)

0 4 3 4 5 
3 3 3 2 1 
1 2 3 4 5 
0 5 3 3 4 
+1

Было бы лучше, если бы вы включили здесь пример, пригодный для копирования. Вам нужно что-то вроде стержня, но набор данных yelp действительно разрежен, поэтому у вас могут быть проблемы с памятью. Эта структура может быть более подходящей. – ayhan

+0

Как вместо ссылки на изображение? Я не уверен, как, но я могу попробовать – mmera

+0

Я думаю, что лучший пример с фиктивными данными, такими как 'df = pd.DataFrame ({'A': ['a', 'b', 'c', 'c'] , 'B': ['g', 'h', 'f', 'p'], 'C': [7,8,9,1]}) ', попробуйте изменить, если потребуется. Также не забудьте добавить желаемый результат. – jezrael

ответ

3

Я думаю, что вам нужно pivot с fillna

print (df.pivot(index='business_id', columns='user_id', values='stars').fillna(0)) 

Если:

ValueError: Index contains duplicate entries, cannot reshape

Затем используйте pivot_table:

print (df.pivot_table(index='business_id', columns='user_id', values='stars').fillna(0)) 
user_id     H1kH6QZV7Le4zqTRNxo KBLW4wJA_fwoWmMhiHR \ 
business_id               
vcNAWiLM4dR7D2nwwJ7nCA     2     4 

user_id     Qrs3EICADUKNFoUq2iH Xqd0DzHaiyRqVH3WRG7 \ 
business_id               
vcNAWiLM4dR7D2nwwJ7nCA     1     5 

user_id     zvJCcrpm2yOZrxKffwG 
business_id         
vcNAWiLM4dR7D2nwwJ7nCA     4 

Но pivot_table использует aggfunc, по умолчанию aggfunc=np.mean если дублей. Лучшее объяснение с образцом - here и в docs.

+0

Я пробовал это, и ядро ​​разбилось. Набор данных определенно был большим. Я собираюсь добавить head() в конец и посмотреть, работает ли это. – mmera

+0

Или, может быть, попробуйте для тестирования 'df_small = df.head (100)' – jezrael

+0

Так что я думаю, что это то, что мне нужно, но это еще не совсем так. Это не первое решение, потому что это дает мне обзоры как ось y. Вместо этого я хочу, чтобы предприятия были осью y. Теоретически второй ответ должен работать, но теперь я получаю сообщение об ошибке: «ValueError: индекс содержит повторяющиеся записи, не может быть изменен» – mmera