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')
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
C'est plus rapide que vous ne le pensez!
df['totalwords'] = [len(x.split()) for x in df['col'].tolist()]
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ᴘᴇᴇᴅ .
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
Avec list
et map
données de froid
list(map(lambda x : len(x.split()),df.col))
Out[343]: [4, 3, 2]
`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.