web-dev-qa-db-fra.com

Compter le nombre de mots par ligne

J'essaie de créer une nouvelle colonne dans une trame de données qui contient le nombre de mots pour la ligne respective. Je regarde le nombre total de mots, pas les fréquences de chaque mot distinct. J'ai supposé qu'il y aurait un moyen simple/rapide de faire cette tâche courante, mais après avoir parcouru Google et lu une poignée de SO posts ( 1 , 2 , , 4 ) Je suis coincé. J'ai essayé les solutions proposées dans les articles liés SO , mais récupérez de nombreuses erreurs d'attribut.

words = df['col'].split()
df['totalwords'] = len(words)

résulte en

AttributeError: 'Series' object has no attribute 'split'

et

f = lambda x: len(x["col"].split()) -1
df['totalwords'] = df.apply(f, axis=1)

résulte en

AttributeError: ("'list' object has no attribute 'split'", 'occurred at index 0')
12
LMGagne

str.split + str.len

str.len fonctionne bien pour n'importe quelle colonne non numérique.

df['totalwords'] = df['col'].str.split().str.len()

str.count

Si vos mots sont séparés par un seul espace, vous pouvez simplement compter les espaces plus 1.

df['totalwords'] = df['col'].str.count(' ') + 1

Compréhension des listes

C'est plus rapide que vous ne le pensez!

df['totalwords'] = [len(x.split()) for x in df['col'].tolist()]
16
cs95

Voici un moyen d'utiliser .apply():

df['number_of_words'] = df.col.apply(lambda x: len(x.split()))

exemple

Compte tenu de cette df:

>>> df
                    col
0  This is one sentence
1           and another

Après avoir appliqué la .apply()

df['number_of_words'] = df.col.apply(lambda x: len(x.split()))

>>> df
                    col  number_of_words
0  This is one sentence                4
1           and another                2

Remarque : Comme souligné par dans les commentaires, et dans cette réponse , .apply N'est pas nécessairement le plus rapide méthode. Si la vitesse est importante, mieux vaut utiliser l'une des méthodes @ cᴏʟᴅsᴘᴇᴇᴅ .

8
sacuL

C'est une façon d'utiliser pd.Series.str.split et pd.Series.map :

df['Word_count'] = df['col'].str.split().map(len)

Ce qui précède suppose que df['col'] est une série de chaînes.

Exemple:

df = pd.DataFrame({'col': ['This is an example', 'This is another', 'A third']})

df['Word_count'] = df['col'].str.split().map(len)

print(df)

#                   col  Word_count
# 0  This is an example           4
# 1     This is another           3
# 2             A third           2
5
jpp

Avec list et map données de froid

list(map(lambda x : len(x.split()),df.col))
Out[343]: [4, 3, 2]
4
WeNYoBen

`df ['count_words'] = df ['Tweet']. apply (lambda x: len (x.split ()))

df ['count_words']. head (10)

`Je faisais une analyse des sentiments sur Twitter et cela a bien fonctionné pour moi.

0
valkyrie55