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.

Pandas categoriza un DataFrame en función de otro DataFrame con subcadenas.

Estoy tratando de aprender pandas y python para transferir algunos problemas de Excel a pandas/python. Tengo un archivo CSV grande de mi banco con más de 10000 registros. Quiero categorizar los registros basándome en la descripción. Para eso, tengo un archivo de mapeo grande con palabras clave. En Excel usaba vLookup y estoy tratando de obtener esta solución en Pandas/python.

Así que puedo leer el CSV en un DataFrame llamado dfMain. Una columna (en dfMain) con texto llamada “description” es mi entrada para categorizarla basándome en un archivo de mapeo llamado dfMap.

dfMain se ve simplificado algo así:

Datum       Bedrag  Description     
2020-01-01  -166.47 een cirkel voor je uit
2020-01-02  -171.79 even een borreling
2020-01-02  -16.52  stilte zacht geluid
2020-01-02  -62.88  een steentje in het water
2020-01-02  -30.32  gooi jij je zorgen weg
2020-01-02  -45.99  dan ben je laf weet je dat
2020-01-02  -322.44 je klaagt ook altijd over pech
2020-01-03  -4.80   jij kan niet ophouden zorgen
2020-01-07  5.00    de wereld te besnauwen

dfMap se ve simplificado así:

    sleutel     code
0   borreling   A1
1   zorgen      B2
2   steentje    C2
3   een         C1

dfMap contiene palabras clave (‘sleutel’) y un código de categoría (‘code’).

Cuando ‘sleutel’ es una subcadena de ‘description’ en dfMain, se agregará una columna adicional llamada ‘category’ en dfMain con el valor del código.
Soy consciente de que se pueden aplicar varias palabras clave a ciertos valores de descripción, pero primero llegan los conteos, en otras palabras: el número de filas en dfMain debe mantenerse igual.

El marco de datos resultante debe parecerse a esto:

Out[34]:

Datum        Bedrag Description                     category        
2020-01-01  -166.47 een cirkel voor je uit          C1
2020-01-02  -171.79 even een borreling              A1
2020-01-02  -16.52  stilte zacht geluid             NaN
2020-01-02  -62.88  een steentje in het water       C2
2020-01-02  -30.32  gooi jij je zorgen weg          B2
2020-01-02  -45.99  dan ben je laf weet je dat      NaN
2020-01-02  -322.44 je klaagt ook altijd over pech  NaN
2020-01-03  -4.80   jij kan niet ophouden zorgen    B2
2020-01-07  5.00    de wereld te besnauwen          NaN

Lo he intentado de muchas formas con join, pero no puedo hacer que funcione.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para categorizar los registros basados en la descripción utilizando el archivo de mapeo, primero puedes leer el archivo csv en un dataframe dfMain usando la función read_csv de pandas. De manera similar, puedes leer el archivo de mapeo en un dataframe dfMap.

    Luego, puedes iterar a través de cada fila en dfMain y verificar si la columna description contiene alguna de las palabras clave en dfMap. Para esto, puedes usar la función apply de pandas junto con una función lambda que busca las palabras clave en la columna description.

    Una vez que hayas identificado las palabras clave, puedes usar la función merge de pandas para agregar el código correspondiente al dataframe dfMain. Puedes hacer la fusión en la columna sleutel en dfMap y la columna description en dfMain.

    Finalmente, puedes llenar cualquier valor faltante en la columna category con NaN.

    Aquí hay un ejemplo de código que hace esto:

    import pandas as pd
    
    # leer el archivo csv en dfMain
    dfMain = pd.read_csv('ruta/al/archivo/csv.csv')
    
    # leer el archivo de mapeo en dfMap
    dfMap = pd.read_csv('ruta/al/archivo/de/mapeo.csv')
    
    # definir una función lambda para buscar palabras clave en la columna de descripción
    buscar_palabras_clave = lambda x: ','.join(dfMap[dfMap['sleutel'].apply(lambda y: y in x)]['code'].tolist())
    
    # aplicar la función buscar_palabras_clave a la columna de descripción en dfMain
    dfMain['category'] = dfMain['description'].apply(buscar_palabras_clave)
    
    # fusionar en las columnas sleutel y description
    dfMain = pd.merge(dfMain, dfMap, how='left', left_on='category', right_on='sleutel')
    
    # eliminar la columna sleutel de dfMain
    dfMain = dfMain.drop('sleutel', axis=1)
    
    # llenar cualquier valor faltante en la columna category con NaN
    dfMain['category'] = dfMain['category'].apply(lambda x: x if x != '' else pd.NaT)
    

    Esto debería darte el dataframe de salida deseado.

Comments are closed.