1
votes

La fonction Pandas str.split () ne fonctionne pas correctement

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]


8 commentaires

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 = 3 ne 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


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


3 Réponses :


1
votes

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]


2 commentaires

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.



1
votes

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


5 commentaires

@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.