1
votes

Comment extraire des notes d'utilisateurs particulières à partir d'un ensemble de données de film?

Cette capture d'écran est l'exemple de l'ensemble de données fusionné movielens, j'ai deux questions:

  1. Si je ne souhaite extraire que l'ID de film, le titre, les genres et les classements de l'utilisateur 191, comment procéder?
  2. Comment puis-je lister uniquement les années à la fin de chaque titre de film?

Tout guide sera très apprécié.

 Capture d'écran de l'ensemble de données Movielens


1 commentaires

Pour votre information: répondre aux questions de manière approfondie prend du temps. Si votre question est résolue , dites merci en acceptant la solution la mieux adaptée à vos besoins . Le < b> accepter le chèque se trouve sous la flèche haut / bas en haut à gauche de la réponse. Une nouvelle solution peut être acceptée si une meilleure se présente. Vous pouvez également voter sur la qualité / l'utilité d'une réponse, avec la flèche vers le haut ou vers le bas, si vous avez une réputation de plus de 15 ans. Laissez un commentaire si une solution ne répond pas à la question. Que dois-je faire lorsque quelqu'un répond à ma question? . Merci.


3 Réponses :


2
votes

Première question; Utilisez une sélection booléenne

df['Year']=df.title.str.extract('\((.*?)\)')

Deuxième question # Utilisez regex pour extraire des phrases entre crochets

df[df['userid']=='191']


6 commentaires

Cela renverrait-il à la fois la phrase et l'année qui apparaissent dans movieid 32?


Que veux-tu dire? La phrase restera dans le titre de la colonne et ma solution crée une nouvelle colonne appelée Année dans laquelle le chiffre de l'année est entré. Si vous extrayez l'année, il ne peut pas apparaître avec la phrase à nouveau dans la même colonne, n'est-ce pas?


Oh, donc votre regex ne renverra une valeur que si les parenthèses ne contiennent que des chiffres? Je ne suis pas trop familier avec les regex, mais cette solution est bonne!


Le cas des expressions régulières fonctionne parfaitement, mais l'autre solution ne produit pas le résultat attendu. Merci beaucoup pour la réponse rapide.


Je suppose qu'ils sont int, pas str.


Y a-t-il une raison pour laquelle vous avez utilisé: . *? sur quelque chose comme \ d + (curieux)



1
votes

Pour la première partie de votre question, vous pouvez filtrer le dataframe.

df['Year'] = df['title'].str[-5:].str.replace(')','')

Pour la deuxième partie de votre question, l'année semble toujours venir à la fin, vous pouvez donc prendre la dernière partie de la chaîne et supprimez les parenthèses.

user191 = df.loc[df['userId']==191]


0 commentaires

1
votes

Créer un dictionnaire de dataframes pour chaque utilisateur unique
  • Utilisez une expression régulière, '\ ((\ d +) \)' pour extraire les chiffres, \ d , entre les parenthèses et attribuez la valeur à films ['Année']
  • Au lieu de filtrer à plusieurs reprises la trame de données pour différents utilisateurs, cela ajoutera chaque utilisateur à un dictionnaire comme clé, et la valeur sera la trame de données filtrée pour cet utilisateur.
    • Il existe 162541 valeurs userId uniques, donc au lieu d'utiliser df.userId.unique () , utilisez une liste de userId spécifique les valeurs qui vous intéressent.
import pandas as pd

# load movies
movies = pd.read_csv('data/ml-25m/movies.csv')

# extract year
movies['Year'] = movies.title.str.extract('\((\d+)\)')

# display head
   movieId                               title                                       genres  Year
0        1                    Toy Story (1995)  Adventure|Animation|Children|Comedy|Fantasy  1995
1        2                      Jumanji (1995)                   Adventure|Children|Fantasy  1995
2        3             Grumpier Old Men (1995)                               Comedy|Romance  1995
3        4            Waiting to Exhale (1995)                         Comedy|Drama|Romance  1995
4        5  Father of the Bride Part II (1995)                                       Comedy  1995

# load ratings
ratings = pd.read_csv('data/ml-25m/ratings.csv')

# merge on movieId
df = pd.merge(movies, ratings, on='movieId').reset_index(drop=True)

# display df
   movieId             title                                       genres  Year  userId  rating   timestamp
0        1  Toy Story (1995)  Adventure|Animation|Children|Comedy|Fantasy  1995       2     3.5  1141415820
1        1  Toy Story (1995)  Adventure|Animation|Children|Comedy|Fantasy  1995       3     4.0  1439472215
2        1  Toy Story (1995)  Adventure|Animation|Children|Comedy|Fantasy  1995       4     3.0  1573944252
3        1  Toy Story (1995)  Adventure|Animation|Children|Comedy|Fantasy  1995       5     4.0   858625949
4        1  Toy Story (1995)  Adventure|Animation|Children|Comedy|Fantasy  1995       8     4.0   890492517

# dict of dataframes
# there are 162541 unique userId values, so instead of using df.userId.unique()
# use a list of the specific Id values you're interested in
userid_movies = dict()
for user in [10, 15, 191]:
    data = df[df.userId == user].reset_index(drop=True)
    userid_movies[user] = data

# display(userid_movies[191].head())
   movieId                                  title                                              genres  Year  userId  rating   timestamp
0    68135                        17 Again (2009)                                        Comedy|Drama  2009     191     3.0  1473704208
1    68791            Terminator Salvation (2009)                    Action|Adventure|Sci-Fi|Thriller  2009     191     5.0  1473704167
2    68954                              Up (2009)                  Adventure|Animation|Children|Drama  2009     191     4.0  1473703994
3    69406                   Proposal, The (2009)                                      Comedy|Romance  2009     191     4.0  1473704198
4    69644  Ice Age: Dawn of the Dinosaurs (2009)  Action|Adventure|Animation|Children|Comedy|Romance  2009     191     1.5  1473704242

Exemple

# question 1: create a column for the year extracted from the title
# extracts the digits between parenthesis
# does not change the title column
df['Year'] = df.title.str.extract('\((\d+)\)')

# create dict of dataframes for each user
userid_movies = dict()
for user in [10, 15, 191]:  # df.userId.unique() = 162541 unique users
    data = df[df.userId == user]
    userid_movies[user] = data

# get data for user 191; assumes ids are int. if not, use '191'
userid_movies[191]  # if you're using jupyter, don't use print

0 commentaires