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
¡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]