En essayant de diviser les valeurs dans la colonne "Actors" de mon dataframe, en utilisant la fonction str.split () de la série Pandas, j'obtiens plus de valeurs que les divisions que j'ai spécifiées:
df = pd.read_csv('https://query.data.world/s/uikepcpffyo2nhig52xxeevdialfl7',index_col=0)
Si j'essaie de découper les résultats ci-dessus en utilisant l'extrait ci-dessous, les NaNs commencent à apparaître dans les résultats:
df['Actors'] = df['Actors'].apply(lambda x: x.split(",")[:3])
df['Actors'].head()
1 [timrobbins, morganfreeman, bobgunton]
2 [marlonbrando, alpacino, jamescaan]
3 [alpacino, robertduvall, dianekeaton]
4 [christianbale, heathledger, aaroneckhart]
5 [martinbalsam, johnfiedler, leejcobb]
Name: Actors, dtype: object
Sinon, si j'essaye l'extrait avec la fonction apply comme ci-dessous, des résultats corrects sont obtenus:
df['Actors'] = df['Actors'].str.split(",",n=3)[:3]
df['Actors'].head()
1 [timrobbins, morganfreeman, bobgunton, william...
2 [marlonbrando, alpacino, jamescaan, richardsca...
3 [alpacino, robertduvall, dianekeaton, robertde...
4 NaN
5 NaN
Name: Actors, dtype: object
Je voulais savoir pourquoi une telle anomalie se produit et comment utiliser correctement la fonction str.split () dans ce cas?
Pour inspecter les données plus en détail, vous pouvez utiliser l'extrait de code ci-dessous pour télécharger les données par vous-même:
df['Actors'] = df['Actors'].str.split(",",n=3)
1 [timrobbins, morganfreeman, bobgunton, william...
2 [marlonbrando, alpacino, jamescaan, richardsca...
3 [alpacino, robertduvall, dianekeaton, robertde...
4 [christianbale, heathledger, aaroneckhart, mic...
5 [martinbalsam, johnfiedler, leejcobb, egmarshall]
3 Réponses :
Ce que vous faites avec df ['Actors'] = df ['Actors']. str.split (",", n = 3) [: 3] ne découpe pas la chaîne mais en découpant la Série . C'est pourquoi vous obtenez des NaN à partir de la quatrième ligne. Réessayez avec [: 2] et vous obtiendrez des NaN s de la troisième ligne.
Avec .apply (lambda x: x [: n]) vous coupez les chaînes individuelles.
Ou, si vous ne voulez pas utiliser .apply () , vous pouvez découper le contenu de chaque ligne au lieu de la série elle-même avec:
df['Actors'] = df['Actors'].str.split(",").str[:3]
L'extrait ci-dessus que vous avez mentionné n'est pas le bon moyen, je jouais juste un peu avec l'extrait. L'extrait de code réel: df ['Actors'] = df ['Actors']. Str.split (",", n = 3), doit diviser la chaîne de la colonne 'Actors' en une liste avec 3 éléments de chaîne mais que ne se passe pas. Pourriez-vous s'il vous plaît m'aider?
J'ai trouvé la réponse par accident. Veuillez m'aider avec l'explication.
Je viens de trouver un moyen d'y parvenir. Pour l'instant, je n'ai pas d'explication à cela. Peut-être que vous pouvez m'aider avec la partie explication, mais cet extrait fonctionne réellement:
df['Actors'] = df['Actors'].str.split(",").str[:3]
df['Actors'].head()
1 [timrobbins, morganfreeman, bobgunton]
2 [marlonbrando, alpacino, jamescaan]
3 [alpacino, robertduvall, dianekeaton]
4 [christianbale, heathledger, aaroneckhart]
5 [martinbalsam, johnfiedler, leejcobb]
Name: Actors, dtype: object
@jorijnsmit Merci beaucoup pour votre aide
Qu'est-ce qui est difficile à expliquer? Vous divisez la chaîne d'acteurs, puis utilisez une tranche pour obtenir les 3 premiers, ce que vous voulez.
Vous pouvez utiliser n = 4 pour ne pas perdre de temps à diviser les noms restants qui ne vous intéressent pas.
Très bien, laissez-moi vous dire ce qui est difficile à obtenir: str.split (",", 3) qu'est-ce que cela reviendrait? Une liste peut-être ??? Ensuite, sur cette liste, comment pouvez-vous appliquer l'accesseur .str, puis la tranche [0: 3] est ma question?
Il ne renvoie pas de liste. Ces choses sont toutes des séries Pandas.
IIUC, vous vous demandez maintenant quelle est la différence entre str.split (",", n = 3) [: 3] et str.split (","). str [: 3]
str.split (",", n = 3) [: 3] est divisé sur ',' de gauche à droite et se divise 3 fois. La sortie du fractionnement est la série où chaque ligne est une liste. Ensuite, vous appelez [: 3] sur la sortie. Il coupe les 3 premières lignes de la sortie et renvoie la nouvelle série de 3 lignes uniquement.
df ['Actors'] = df ['Actors']. str.split (",", n = 3) [: 3] est l'attribution de séries. L'affectation des séries est alignée sur l'index. Tout df ['Actors']. Index n'existe pas dans la série de 3 lignes en sortie sera assigné comme NaN dans la valeur. C'est la raison pour laquelle le final df ['Actors'] n'a que 3 lignes ayant des valeurs et le reste est NaN
Sur df ['Actors']. str.split (","). str [: 3] , c'est Pandas Indexation avec .str . C'est-à-dire, c'est une fonctionnalité intégrée de l'accesseur pandas str. Il tranche la série entière sur toutes les lignes par le nombre passant à [] . Vous pouvez le lire plus ici: https: //pandas.pydata.org/pandas-docs/stable/user_guide/text.html#indexing-with-str . Il renvoie des séries de même longueur (même nombre de lignes) que l'original où les valeurs de chaque ligne sont découpées par le nombre à l'intérieur de [] .
Vous n'obtenez pas plus de valeurs que ce que vous avez spécifié. C'est juste difficile à dire, car la virgule est le séparateur entre les valeurs et également dans les données d'origine, et elle n'affiche pas de guillemets autour des chaînes. Vous obtenez
["timrobbins", "morganfreeman", "bobgunton, william ..."]Veuillez essayer d'utiliser les lignes suivantes pour télécharger une fois les données de votre notebook jupyter ou de votre shell i-python: df = pd.read_csv (' query.data.world/s/... ) df ['Actors'] = df ['Actors']. Str.strip (). Str.lower (). str.replace ("[^ a-zA-Z,] ", "") df ['Acteurs'] = df ['Acteurs']. str.split (",", n = 3) df [' Acteurs ']. Tête (). Cela vous donnera une meilleure compréhension des données
Je n'utilise ni jupyter ni i-python.
Avez-vous des exemples de données disponibles?
Le fait est que
n = 3ne signifie pas tout supprimer après le troisième élément. Cela signifie que tous sont inclus dans la 3e valeur.Voir l'exemple dans la documentation a>
J'ai publié l'extrait pour lire les données. Vous pouvez vérifier que
@Barmar J'ai publié une réponse. S'il vous plaît aider avec l'explication