Comment résoudre Python Pandas attribuer erreur lors de la création d'une nouvelle colonne

0

La question

J'ai un dataframe contenant de la maison descriptions:

description
0   Beautiful, spacious skylit studio in the heart...
1   Enjoy 500 s.f. top floor in 1899 brownstone, w...
2   The spaceHELLO EVERYONE AND THANKS FOR VISITIN...
3   We welcome you to stay in our lovely 2 br dupl...
4   Please don’t expect the luxury here just a bas...
5   Our best guests are seeking a safe, clean, spa...
6   Beautiful house, gorgeous garden, patio, cozy ...
7   Comfortable studio apartment with super comfor...
8   A charming month-to-month home away from home ...
9   Beautiful peaceful healthy homeThe spaceHome i...

Je suis en train de compter le nombre de phrases sur chaque ligne (à l'aide de sent_tokenize à partir de nltk.tokenize) et ajouter ces valeurs dans une nouvelle colonne, sentence_count, à l' df. Depuis cette est une partie d'un plus grand pipeline de données, je suis en utilisant les pandas assign pour que je puisse les opérations de la chaîne.

Je n'arrive pas à le faire fonctionner, cependant. J'ai essayé:

df.assign(sentence_count=lambda x: len(sent_tokenize(x['description'])))

et

df.assign(sentence_count=len(sent_tokenize(df['description'])))

mais à la fois d'améliorer le suivant errro:

TypeError: expected string or bytes-like object

J'ai confirmé que chaque ligne a un dtype de str. Peut-être que c'est parce que description a dtype('O')?

Ce que je fais mal ici? À l'aide d'un pipe avec une fonction personnalisée fonctionne très bien ici, mais je préfère utiliser assign.

assign lambda pandas python
2021-11-20 15:22:52
1

La meilleure réponse

1

x['description'] lorsque vous passez à sent_tokenize dans le premier exemple est un pandas.Series. Ce n'est pas une chaîne. C'est une Série (similaire à une liste de chaînes de caractères.

Ainsi, au lieu que vous devriez faire ceci:

df.assign(sentence_count=df['description'].apply(sent_tokenize))

Ou, si vous avez besoin de passer des paramètres supplémentaires pour sent_tokenize:

df.assign(sentence_count=df['description'].apply(lambda x: sent_tokenize(x)))
2021-11-20 15:40:57

C'est ce que faisaient à l'origine, mais je suis à la recherche d'un moyen de chaîne sent_tokenize sans df['counts'] =. Est-il un moyen de faire partie de la chaîne de l'opération?
mmz

Oui! Il y est. Je ne savais pas qu'est ce que vous étiez en train de faire avec df.assign :) La vérification de la réponse maintenant.
richardec

Excellent, merci! Juste une chose pour les futurs lecteurs: je pense que x['description'] devrait être df['description']. Vous obtenez un message d'erreur sinon
mmz

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................