Cette capture d'écran est l'exemple de l'ensemble de données fusionné movielens, j'ai deux questions:
Tout guide sera très apprécié.
3 Réponses :
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']
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)
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]
'\ ((\ d +) \)'
pour extraire les chiffres, \ d
, entre les parenthèses et attribuez la valeur à films ['Année'] 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
# 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
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.