Cuenta el número de palabras por fila

Estoy intentando crear una nueva columna en un dataframe que contiene el recuento de palabras para la fila respectiva. Estoy buscando el número total de palabras, no las frecuencias de cada palabra distinta. Asumí que habría una forma simple / rápida de hacer esta tarea común, pero después de buscar en Google y leer un puñado de publicaciones de SO ( 1 , 2 , 3 , 4 ) estoy atascado. He probado las soluciones presentadas en las publicaciones de SO vinculadas, pero recupero muchos errores de atributos.

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

resultados en

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

y

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

resultados en

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

str.split + str.len

str.len funciona bien para cualquier columna no numérica.

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

str.count

Si sus palabras están separadas por un solo espacio, simplemente puede contar los espacios más 1.

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

Comprensión de lista

¡Esto es más rápido de lo que piensas!

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

Aquí hay una forma de usar .apply() :

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

ejemplo

Dado este df :

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

Después de aplicar el .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 

Nota : Como se indica en los comentarios, y en esta respuesta , .apply no es necesariamente el método más rápido. Si la velocidad es importante, mejor vaya con uno de los métodos de @cᴏʟᴅsᴘᴇᴇᴅ .

Esta es una forma de usar pd.Series.str.split y pd.Series.map :

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

Lo anterior asume que df['col'] es una serie de cadenas.

Ejemplo:

 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 

Con list y datos de map de frío.

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