A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Limpiando detalles adicionales

29/38
Recursos

Aportes 44

Preguntas 5

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

(va sin acentos)
En mi caso tenia que borrar mas de una expresion.
Tampoco es necesario pasar el body a lista, podemos hacer replace directamente (en este caso, si)

Opcion 1:

stripped_body2 = (el_universal
                    .apply(lambda row: row['body'], axis=1)
                    .apply(lambda body: body.replace('\n',''))
                    .apply(lambda body: body.replace('\r',''))
                )

stripped_body2

O usando expresiones regulares, MI FAVORITA:
Opcion 2:

import re

stripped_body3 = (el_universal
                    .apply(lambda row: row['body'], axis=1)
                    .apply(lambda body: re.sub(r'(\n|\r)+',r'', body))
                )

stripped_body3```

Un poco acorde con el zen de Python recomendaria cambiar :
stripped_body =(el_universal
.apply(lambda row: row[鈥榖ody鈥橾,axis=1)
.apply(lambda body: list(body))
.apply(lambda letters: list(map(lambda letter:letter.replace(鈥橽n鈥,鈥欌),letters)))
.apply(lambda letters: 鈥樷.join(letters))
)
por esto:
el_universal[鈥榖ody鈥橾.str.replace(鈥橽n鈥,鈥欌)

Vuelvo insisto a Platzi que aunque del web sacraper salgo un archivo csv, deben colgarlo para seguir los ejercicios. Algunas observaciones del archivo csv generado no cumplen las condiciones de los ejercicios del video. Por lo cual, colocar el script como lo hace el profesor, no funciona!!

Cuando usar .apply y cuando .applymap ?

Comparto el c贸digo comentado:

# 4 A帽adir uid a las filas
import hashlib  # Libreria dentro de libreria estandar, para operaciones criptograficas
# Numero unico para poder identificar a nuestra fila

uids = (el_universal
            .apply(lambda row: hashlib.md5(bytes(row['url'].encode())), axis=1)
            # Aplicamos la funcion a las filas (axis=1). La funci贸n md5 de la librer铆a hashlib no debe ser utilizada para criptografia. Lo utilizamos porque nos puede dar un identificador unico. Nos da un numero de 128 bytes que lo vamos a representar en hexadecimal. Lo codificamos en utf-8 gracias a la funci贸n .encode(). 
            .apply(lambda hash_object: hash_object.hexdigest())
            # El hash object obtenido anteriormente lo conventimos en un numero hexadecimal 

)

el_universal['uid'] = uids  # A帽adimos el hash generado al dataframe
el_universal.set_index('uid', inplace=True) # Ahora queremos que esta sea nuestro indice.

el_universal

2da parte:

# Eliminamos los saltos de l铆nea de nuestros ariculos contenidos en la columna body

stripped_body = (el_universal
                    .apply(lambda row: row['body'], axis=1)
                    # Aplicamos una modificacion a cada una de las filas. La forma de obtener estas filas es diciendo que el axis=1
                    .apply(lambda body: list(body))  # Seleccionamos la columna body y convertimos cada fila en una lista de letras.
                    .apply(lambda letters: list(map(lambda letters: letters.replace('\n', ''), letters))) 
                    # Por cada letra en la lista de una fila del body reemplazamos en esta los saltos de lineas por espacios.
                    # Esto lo convertimos en un map para que podamos pasarle la lista con la que trabajar谩.
                    # Convertimos el objeto map entregado por la funcion map en un objeto lista.
                    .apply(lambda letters: ''.join(letters))
                    # Unimos las letras de cada lista para que obtener finalmente un string por fila

                )
stripped_body

El string

googletag.cmd ...

Se puede eliminar con el regex

\bgoogletag\..*}\);

Ejemplo:

eluniversal['body'].str.replace(r'\n|\xa0', ' ').str.replace(r'\bgoogletag\..*}\);','')

Hola comunidad pthon, una consulta la funcionalidad .apply me pueden ustedes hablar como han internalizado su concepto, su uso? muchas gracias de antemano por su respuestas

Lo que pude ver es que la porci贸n de c贸digo:

eluniversal.apply(lambda row: row['body'], axis=1)

es lo mismo que:

eluniversal['body']

Adicionalmente, revisando comentarios encontr茅 una forma de reemplazar con expresi贸n regular (https://platzi.com/comentario/669160/) que combin谩ndolo con lo anterior, se obtiene una forma m谩s compacta para hacer el stripped_body:

stripped_body = eluniversal['body'].apply(lambda body: re.sub(r'(\n|\r)+', '', body))

para reemplazar los espacios y \r \n use

el_universal['body'].str.strip()```

Otra forma de solucionarlo

`stripped_body = (el_universal
.apply(lambda row: row[鈥榖ody鈥橾, axis=1)
.astype(str).apply(lambda body: body.replace(鈥橽n鈥, 鈥 '))
)

stripper_body`

Por ejemplo me falta la estatura de varias personas, si la relleno con la estatura promedio de la lista estoy incurriendo en un error?

veo que utilizan mucho la funcion lambda, apply y map, pero todavia no me queda bien claro sus funciones y la manera tan reducida de encapsular codigo que tiene python, es algo confusa, hay alguna manera de sencilla de encontrar informacion sobre esto. ALguna documentacion

Para quitar los espacios en blanco del principio y del final, se puede usar la funci贸n strip()
ejemplo:
a=" \n hola "
a=a.strip()[
[OUT] >> 鈥渉ola鈥

Lo estoy implementando tal como se muestra en la clase con el fin de familiarizarme m谩s con .apply
Pero creo que es m谩s sencillo usar expresiones regulares

tag_regex = re.compile(r'.*\n.*') 
for _ in el_universal['body']:
    re.sub(tag_regex, '', _)
el_pais['body']```

Si te aparecen '\r鈥
Puedes cambiar

letter.replace('\n', ' ')

Por

letter.replace('\n', ' ').replace('\r', '')

En mi caso tuve que limpiar tambien los\r

stripped_body = (el_universal
                    .apply(lambda row:row['body'], axis =1)
                    .apply(lambda body: list(body))
                    .apply(lambda letters: list(map(lambda letter: letter.replace('\n', ''), letters)))
                    .apply(lambda letters: list(map(lambda letter: letter.replace('\r', ''), letters)))
                    .apply(lambda letters: ''.join(letters))
                )

stripped_body```

Diferencia entre apply y applymap? Muchas gracias de antemano.

Hola, si alguno tuvo el error

<ipython-input-44-603ef07bc32d> in <lambda>(body)
      1 stripped_body = (el_universal
      2                     .apply(lambda row: row['body'], axis=1)
----> 3                     .apply(lambda body: list(body))
      4                     .apply(lambda letters : list(map(lambda letter : letter.replace('\n', ''),letters)))
      5                     .apply(lambda letters : ''.join(letters))

TypeError: 'float' object is not iterable

La soluci贸n para mi fue definir el tipo de dato de 鈥渂ody鈥 como string:

stripped_body = (el_universal
                    .apply(lambda row: row['body'], axis=1)
                    .astype(str) #Define el tipo de dato como string
                    .apply(lambda body: list(body))
                    .apply(lambda letters : list(map(lambda letter : letter.replace('\n', ''),letters)))
                    .apply(lambda letters : ''.join(letters)))

Hey, en lugar de map probe con un filter, obtuve el mismo resultado 馃槂

stripped_body = (el_universal_df
                        .apply(lambda row: row['body'], axis = 1)
                        .apply(lambda body: list(body))
                        .apply(lambda letters: list(filter(lambda letter: letter != '\n', letters)))
                        .apply(lambda letters: ''.join(letters))
                    )

stripped_body    
stripped_body = (el_universal
                    .apply(lambda row: row['body'].replace("\n", "").replace("\r", ""), axis=1)
                )

Estos procesos de transformaci贸n de datos que se estan haciendo, no son un paradigma de programaci贸n llamado programaci贸n funcional, si quieren aprender un poco mas sobre ella:
https://www.kite.com/blog/python/functional-programming/


A mi me sali贸 este error de float: 鈥榝loat鈥 object is not iterable.
soluci贸n:

A帽adir astype(str)

Ejemplo:

stripped_body = (el_universal
.apply(lambda row: row[鈥榖ody鈥橾, axis=1).astype(str)
.apply(lambda body: list(body))
)
stripped_body

Buenas tardes,

yo no logro entender la palabra lambda, no entiendo su funci贸n, que sucede si en vez de su uso se usara un for loop o algo similar?, seria ineficiente?

Seg煤n la documentaci贸n de pandas:

axis = 1 se refiere a las columnas
axis = 0 se refiere a las filas

Me siguen apareciendo errores 馃槙

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-29-d5a856c06f03> in <module>
      1 stripped_body = (el_universal
      2                      .apply(lambda row: row['body'], axis=1)
----> 3                      .apply(lambda body: list(body))
      4 )
      5 

~/anaconda3/lib/python3.7/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
   3589             else:
   3590                 values = self.astype(object).values
-> 3591                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   3592 
   3593         if len(mapped) and isinstance(mapped[0], Series):

pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()

<ipython-input-29-d5a856c06f03> in <lambda>(body)
      1 stripped_body = (el_universal
      2                      .apply(lambda row: row['body'], axis=1)
----> 3                      .apply(lambda body: list(body))
      4 )
      5 

TypeError: 'float' object is not iterable

En esta pagina se encuentra un ejemplo sobre como reemplazar multiples valores incluyendo el uso de expresiones regulares y funciones lambda

aqui mi resultado鈥

Par谩metro axis:
Eje 0: columnas
Eje 1: filas

excelente clase

muy interesante!

cuerpo_final=(semana
              .apply(lambda row: row['cuerpo'], axis=1)
              .apply(lambda cuerpo: cuerpo.strip())
              .apply(lambda cuerpo: list(cuerpo))              
              .apply(lambda letras: list(map(lambda letra: letra.replace('\r',''), letras)))
              .apply(lambda letras: list(map(lambda letra: letra.replace('\n',''), letras)))
              .apply(lambda letras: ''.join(letras))
             )

uid                                                             cuerpo
35e28f859991bd2375ac31c604236ce2    La Procuradur铆a General de la Naci贸n afirma qu...
2423919c056437f6db54529c7ba63dab    En medio de la emergencia por el coronavirus, ...
d770672fac28323de9a11b0dd72d69a9    Eso de que el mundo va a ser mejor luego de qu...
f366db1296904bab99f168c3457b09f3    A pocos das de las tradicionales reuniones de...
43ce0880c70d530f7a5e282ca6090d1a    Liliana Gim茅nez ten铆a 44 a帽os y viv铆a en C贸rdo...
                                                          ...                        
27f4d9dbf2e392aa7ba679b741cc03eb    El a帽o pasado, Foros Semana realiz贸 el foro 鈥M...
093927475a475c7df08c4969415a44b9    Se trata de sobrevivir. Por esa raz贸n miles, m...
97efd70814caf43048ecaed9210a8849    La Fiscal铆a y la Polic铆a capturaron este jueve...
d7d19208fd313e8166d1bbb607720de6    En los 煤ltimos das, ante la demora en la entr...
5ae8615129620ba12d131d1125a8d9b9    Shirkers - Muy buena Directora: Sandi Tan Pa铆s...
Length: 70, dtype: object

Vamos por mas 鈥

Por si presentan el siguiente problema:
TypeError: (鈥榮tring argument without an encoding鈥, 鈥榦ccurred at index 0鈥)
se soluciona con esto

<code>
.apply(lambda row: hashlib.md5(bytes(row['url'],encoding='ISO-88591')),axis=1)
            .apply(lambda hash_object: hash_object.hexdigest())

Intente eliminar los 鈥-鈥 pero no me funciono:

Si alguien mas le sucede que screapea un title con muchos espacios al inicio esta fue una soluci贸n que logr茅 construir.

no es muy limpia pero funciona:

import functools

space = ''

def drop_space(let):
    global space
    space = ' '
    return let

def init_space(list):
    global space
    space = ''
    return list



stripped_body = (el_universal
                 .apply(lambda row: row['body'], axis=1)
                 .apply(lambda body: list(body))
                 .apply(lambda letters: list(map(lambda letter: letter.replace('\n', ''), letters)))
                 .apply(lambda letters: list(map(lambda letter: letter.replace('\r', ''), letters)))
                 .apply(lambda letters: init_space(list(map(lambda letter: [let.replace(' ',space) if let == " " else drop_space(let) for let in letter], letters))))
                 .apply(lambda letters: list(functools.reduce(lambda a,b : a + b, letters)))
                 .apply(lambda letters:''.join(letters))
                )
print(stripped_body)```

Hola compa帽eros, aqu铆 info sobre hashlib:

https://docs.python.org/2/library/hashlib.html

aqu铆 info sobre md5:

https://es.wikipedia.org/wiki/MD5

aqu铆 info sobre por qu茅 es vulnerable.:

https://es.wikipedia.org/wiki/Colisi贸n_(hash)

Despues de probar varias formas me funcion贸 as铆, aplicando map directamente sobre la serie

stripped_body = el_universal['body'].map(lambda letter: letter.replace('\n',''),na_action='ignore')
stripped_body```

el primer re.sub cambia todos los 鈥溾橽n鈥 y 鈥淺r鈥 por " "
el segundo re.sub cambia todos los espacios vac铆os al inicio y al final del string por 鈥溾

import re
stripped_title = (gutenberg
.apply(lambda row: row["title"], axis=1)
.apply(lambda title: re.sub(r"([\n|\r])+", r" ", title))
.apply(lambda title: re.sub(r"(^([\s]+))|(([\s]+)$)", r"", title))
)
stripped_title

Hola, les comparto. Como borrar las columnas que no est茅n en NaN

missing_datas = (articulos_periodico["title"].isnull()) | (articulos_periodico["body"] == " ")

missing_datas_titles = articulos_periodico[missing_datas].index

for i  in missing_datas_titles:
    articulos_periodico = articulos_periodico.drop(i)

Excelente aplicaci贸n, funciona muy bien.

# 4 A帽adir uid a las filas
import hashlib  # Libreria dentro de libreria estandar, para operaciones criptograficas
# Numero unico para poder identificar a nuestra fila

uids = (el_universal
            .apply(lambda row: hashlib.md5(bytes(row['url'].encode())), axis=1)
            # Aplicamos la funcion a las filas (axis=1). 
#La funci贸n md5 de la librer铆a hashlib no debe ser utilizada para criptografia. 
#Lo utilizamos porque nos puede dar un identificador unico. 
#Nos da un numero de 128 bytes que lo vamos a representar en hexadecimal. 
#Lo codificamos en utf-8 gracias a la funci贸n .encode(). 
  
          .apply(lambda hash_object: hash_object.hexdigest())
           
 # El hash object obtenido anteriormente lo conventimos en un numero hexadecimal 

)

el_universal['uid'] = uids  # A帽adimos el hash generado al dataframe
el_universal.set_index('uid', inplace=True) 
# Ahora queremos que esta sea nuestro indice.

el_universal

#Eliminamos los saltos de l铆nea de nuestros art铆culos 
#contenidos en la columna body
#

stripped_body = (el_universal
                    .apply(lambda row: row['body'], axis=1)

#Aplicamos una modificacion a cada una de las filas
#La forma de obtener estas filas es diciendo que el axis=1

		    .apply(lambda body: list(body))  

# Seleccionamos la columna body y convertimos cada 
#fila en una lista de letras
#

        .apply(lambda letters: list(map(lambda letters: letters.replace('\n', ''), letters))) 


# Por cada letra en la lista de una fila del body reemplazamos 
#en esta los saltos de lineas por espacios
# Esto lo convertimos en un map para que podamos 
#pasarle la lista con la que trabajar谩
# Convertimos el objeto map entregado por la funcion map en un objeto lista
#                  .
			.apply(lambda letters: ''.join(letters))
# Unimos las letras de cada lista para que obtener finalmente un string por fila

                )


stripped_body```

Excelente ejercicio

stripped_body = (el_universal
                     .apply(lambda row: row['body'], axis=1)
                     .apply(lambda body: list(body))
                     .apply(lambda letters: list(map(lambda letter: letter.replace('\n', ''), letters)))
                     .apply(lambda letters: ''.join(letters))
)
stripped_body