es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    import pandas as pd
    
    # leer el archivo CSV en un DataFrame de pandas
    df = pd.read_csv("ruta/al/archivo.csv")
    
    # definir una función para verificar si el CPRNUM es válido
    def isCPRNUMvalido(val):
        if len(val) == 10: # si la cadena tiene longitud de 10
            if val.isnumeric(): # si la cadena es un número puro
                return True
        return False
    
    # definir una función para verificar si REQ_SAMPLETIME es válido
    def isREQ_SAMPLETIMEvalido(val):
        try:
            pd.to_datetime(val)
            return True
        except:
            return False
    
    # filtrar las filas del DataFrame que tienen CPRNUM y REQ_SAMPLETIME válidos
    df = df[df["CPRNUM"].apply(isCPRNUMvalido)]
    df = df[df["REQ_SAMPLETIME"].apply(isREQ_SAMPLETIMEvalido)]
    
    # imprimir el DataFrame limpio
    print(df)
    

    Aquí, primero definimos dos funciones isCPRNUMvalido e isREQ_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ón apply 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:

    # crear un nuevo DataFrame con las filas limpias
    clean_df = df.loc[df["CPRNUM"].apply(isCPRNUMvalido) & df["REQ_SAMPLETIME"].apply(isREQ_SAMPLETIMEvalido)].copy()
    
    # imprimir el DataFrame limpio
    print(clean_df)
    

    Esto creará un nuevo DataFrame clean_df que contiene solo las filas limpias, sin modificar el DataFrame original.

Comments are closed.