2016-09-09 2 views
-1

У меня этот объектив dataframe. У него есть столбцы для классификации жанров, к которым принадлежит фильм. Категории жанров - это имена столбцов с двоичными значениями в строках. Если фильм принадлежит жанру, он имеет 1 под соответствующим столбцом и 0 в противном случае. Я хочу рассчитать средний рейтинг по жанру для каждого пользователя в python pandas.Как вы рассчитываете средний рейтинг по жанру в python?

# pass in column names for each CSV 
u_cols = ['user_id', 'age', 'sex', 'occupation', 'zip_code'] 
users = pd.read_csv('C:/Users/End-User/Desktop/ml-100k/u.user', 
        sep='|',names=u_cols, encoding='latin-1') 

r_cols = ['user_id', 'movie_id', 'rating', 'unix_timestamp'] 
ratings = pd.read_csv('C:/Users/End-User/Desktop/ml-100k/u.data', 
         sep='\t', names=r_cols, encoding='latin-1') 

# Reading item file: 
m_cols = ['movie_id', 'title' ,'release_date','video_release_date', 'imdb_url', 
      'unknown', 'Action', 'Adventure', 'Animation', 'Children\'s', 'Comedy', 
      'Crime', 'Documentary', 'Drama', 'Fantasy', 'Film-Noir', 'Horror', 
      'Musical', 'Mystery', 'Romance', 'Sci-Fi','Thriller', 'War', 'Western'] 

movies = pd.read_csv('C:/Users/End-User/Desktop/ml-100k/u.item', 
         sep='|', names=m_cols, encoding='latin-1') 

# create one merged DataFrame 
movie_ratings = pd.merge(movies, ratings) 
lens = pd.merge(movie_ratings, users) 

# I have tried this but don't know how to get the average of the ratings for each user.  
df = pd.pivot_table(lens, index = ['user_id'], 
        columns = ['unknown', 'Action', 'Adventure', 'Animation', 
           'Children\'s', 'Comedy', 'Crime', 'Documentary', 
           'Drama', 'Fantasy', 'Film-Noir', 'Horror', 
           'Musical', 'Mystery', 'Romance', 'Sci-Fi', 
           'Thriller', 'War', 'Western'], 
        values = ['rating']) 
print df 
+1

Что именно ваш вопрос. Что вы пробовали? –

+0

Добро пожаловать в StackOverflow. Прочтите и следуйте инструкциям по отправке в справочной документации. [по теме] (http://stackoverflow.com/help/on-topic) и [как спросить] (http://stackoverflow.com/help/how-to-ask) применяются здесь. StackOverflow не является кодовым или учебным сервисом. – Prune

ответ

0

Рассмотрим изменения формы вашего dataframe от широкоугольного до тех пор, чтобы создать жанр колонки, а затем запустить результат через pivot_table() используя свой aggfunc аргумент, специально для Numpy означают:

import pandas as pd 
import numpy as np 

#...same code... 

lens = pd.merge(movie_ratings, users) 

genrecols = ['unknown', 'Action', 'Adventure', 'Animation', 
      'Children\'s', 'Comedy', 'Crime', 'Documentary', 
      'Drama', 'Fantasy', 'Film-Noir', 'Horror', 
      'Musical', 'Mystery', 'Romance', 'Sci-Fi', 
      'Thriller', 'War', 'Western'] 

# RESHAPE DF BY MELTING (WIDE TO LONG), SELECTING ONLY NEEDED FIELDS  
mdf = pd.melt(lens[['user_id', 'sex', 'rating'] + genrecols], 
       id_vars=['user_id', 'sex', 'rating'], var_name='genre') 

# FILTER FOR VALUE = 1 AND THREE NEEDED COLUMNS 
mdf = mdf[mdf['value']==1][['user_id', 'sex', 'rating', 'genre']] 

# RUN PIVOTED AGGREGATION  
df = pd.pivot_table(mdf, columns = ['genre'], index = ['user_id', 'sex'], 
        values = ['rating'], aggfunc = np.mean) 

print df 
+0

Это именно то, что мне нужно. Большое спасибо Парфе. Еще одна вещь, как бы вы добавили столбец с сексом пользователя? Я пробовал: new_df = pd.merge (df, users ['sex']), но не работает. Действительно новый для панд. Нужно, чтобы этот новый формат df выполнял логистическую регрессию, чтобы получить секс от своего среднего рейтинга по жанру. – Student

+0

Просто добавьте 'sex' в поля, чтобы сохранить во всех соответствующих строках, а затем в pivot добавить его в' index' arg. См. Править. – Parfait

+0

Отлично. Еще раз, спасибо. Действительно оценен. – Student

Смежные вопросы