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.

Comparar dos dataframes utilizando subcadenas en cada celda, mantener los datos en el primer dataframe si se encuentran en la posición correspondiente en el segundo dataframe.

Tengo dos dataframes. Ambos tienen el mismo índice y las mismas etiquetas de columna. Quiero compararlos por subcadena y ubicación de celda.

data_1 = {‘columna A’: [‘AA (1)’, ‘nan’, ‘nan’, ‘DD (6)’, ‘nan’],
‘columna B’: [‘AA (8)’, ‘nan’, ‘CC (3)’, ‘nan’, ‘nan’],
‘columna C’: [‘AA (9)’, ‘nan’, ‘CC (7)’, ‘DD (5)’, ‘nan’]}
df_1 = pd.DataFrame(data_1)
data_2 = {‘columna A’: [‘AA’, ‘BB’, ‘nan’, ‘nan’, ‘nan’],
‘columna B’: [‘nan’, ‘nan’, ‘CC’, ‘nan’, ‘EE’],
‘columna C’: [‘nan’, ‘BB’, ‘CC’, ‘DD’, ‘nan’]}
df_2 = pd.DataFrame(data_2)

El primer dataframe contiene los datos que quiero mantener, dado que los dos primeros caracteres son los mismos y están en la misma ubicación en el segundo dataframe. Por ejemplo, comparar ‘columna A’ entre ambos dataframes. Mantener solo ‘AA (1)’ en la columna uno ya que la subcadena ‘AA’ está en ambos dataframes y en la misma ubicación, pero descartar ‘DD (6)’.

Aquí está la salida deseada:

data_3 = {‘columna A’: [‘AA (1)’, ‘nan’, ‘nan’, ‘nan’, ‘nan’],
‘columna B’: [‘nan’, ‘nan’, ‘CC (3)’, ‘nan’, ‘nan’],
‘columna C’: [‘nan’, ‘nan’, ‘CC (7)’, ‘DD (5)’, ‘nan’]}
df_3 = pd.DataFrame(data_3)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr esto, podemos usar el método str.contains() de pandas para verificar la presencia de la subcadena en ambos dataframes. También podemos usar str[:2] para obtener los dos primeros caracteres de la cadena y verificar si están en la misma posición.

    Aquí está el código Python que puede lograr esto:

    import pandas as pd
    
    data_1 = {'columna A': ['AA (1)', 'nan', 'nan', 'DD (6)', 'nan'], 
              'columna B': ['AA (8)', 'nan', 'CC (3)', 'nan', 'nan'], 
              'columna C': ['AA (9)', 'nan', 'CC (7)', 'DD (5)', 'nan']}  
    df_1 = pd.DataFrame(data_1)
    
    data_2 = {'columna A': ['AA', 'BB', 'nan', 'nan', 'nan'], 
              'columna B': ['nan', 'nan', 'CC', 'nan', 'EE'], 
              'columna C': ['nan', 'BB', 'CC', 'DD', 'nan']}  
    df_2 = pd.DataFrame(data_2)
    
    df_3 = df_1.copy() # hacer una copia de df_1
    
    for col in df_1.columns:
        # filtrar df_2 verificando la subcadena y la misma ubicación
        mask = df_2[col].str.contains(df_1[col].str[:2]) & (df_1[col].str[:2] == df_2[col].str[:2])
        # actualizar df_3 con los valores filtrados
        df_3.loc[mask, col] = df_2.loc[mask, col]
    
    print(df_3)
    

    La salida para df_3 será la misma que la salida deseada en la pregunta.

Comments are closed.