Limpiar datos, eliminar filas con algún texto en ciertas columnas.
Estoy intentando limpiar algunas fechas en conjuntos de datos enormes y soy nuevo en Python (he usado Google para buscar mi problema), así que por favor ten paciencia con mi terminología.
Los datos se importan de un archivo CSV a un pandas.core.frame.DataFrame. Algunas de mis columnas solo deberían contener números y otras solo texto:
CPRNUM REQ_SAMPLETIME SAMPLE_ID RESULT
0 1234567890 2014-05-30 07:59 50226686 0.7409090909090907
1 The sample was.. 2013-09-04 07:45 47721186 0.8290909090909093
2 1234567890 The sample was.. 46473016 1.0918181818181818
Me gustaría deshacerme de las filas que no tengan 10 dígitos de longitud en las columnas REQ_SAMPLETIME y CPRNUM, y que contengan texto, de modo que quede así:
CPRNUM REQ_SAMPLETIME SAMPLE_ID RESULT
0 1234567890 2014-05-30 07:59 50226686 0.7409090909090907
3 0987654321 2018-06-10 05:32 12354678 3.7290909090909093
4 1234567890 2013-09-04 07:45 15672687 5.9999951818181818
Gracias por la ayuda.
Gracias a Danish Bansal, utilicé tu código, ya que se ajusta mejor a mi problema:
Mi código final se ve así:
hba1c = pd.read_csv(r"C:\sample.csv", encoding='unicode_escape', engine='python', sep=';')
# Esta función verifica si el número es válido
def isCPRNUMvalid(val):
if len(val) == 10: # si la cadena tiene una longitud de 10
if val.isnumeric(): # si la cadena es solo números
return True
return False
hba1c['validCRPNUM'] = hba1c['CPRNUM'].apply(isCPRNUMvalid)
hba1c = hba1c[hba1c.validCRPNUM]
hba1c['Dates'] = pd.to_datetime(hba1c['REQ_SAMPLETIME']).dt.date
C:\Users\tphni.conda\envs\py37\lib\site-packages\ipykernel_launcher.py:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
"""
hba1c.head()
Recibo el mensaje de error como se muestra arriba en el código, pero parece que aún funciona y la salida es la esperada, con la cantidad correcta de filas menos que en el archivo original.
davy.ai
Solución para la limpieza de datos en Python
Para eliminar las filas que tienen números de CPR no válidos y tiempos de solicitud de muestra no válidos, podemos utilizar las funciones de pandas en Python. Aquí hay una posible solución:
Aquí, primero definimos dos funciones
isCPRNUMvalido
eisREQ_SAMPLETIMEvalido
para verificar si los valores de CPRNUM y REQ_SAMPLETIME son válidos. Luego, aplicamos estas funciones a las columnas correspondientes del DataFrame utilizando la funciónapply
y filtramos las filas que pasan las pruebas de validación utilizando la indexación booleana.Ten en cuenta que al ejecutar este código, es posible que obtengas un mensaje de advertencia que dice
Se está intentando establecer un valor en una copia de una sección de un DataFrame
. Esta advertencia ocurre porque estamos modificando las filas filtradas del DataFrame original. Para evitar esta advertencia, podemos utilizar el accesor.loc
para asignar las filas filtradas a un nuevo DataFrame:Esto creará un nuevo DataFrame
clean_df
que contiene solo las filas limpias, sin modificar el DataFrame original.