Busque un valor en pandas con marcos de datos de longitudes desiguales

Sigo trabajando en mi proyecto de análisis webscraper/data y estoy atrapado en un artículo. Quiero determinar cuánto tiempo ha estado una mascota en el refugio. Para hacer esto, tengo un contador para determinar el recuento de identificación de la mascota. Para ver si la mascota está todavía en el refugio o no, quiero comparar mi lista de IDs a la lista de hoy. La lógica, si el PetID sigue en la lista de hoy, entonces la mascota no es adoptada todavía. Si no lo es, estamos asumiendo que la mascota ha sido adoptada. aquí está una burla de los datos simplificados:

' ' enter image description here

... Así que me gustaría comparar PetID con PetIDHoy y quiero conseguir el TimeToAdopt para poblar como se muestra

Pero cuando ejecuto el siguiente código, obtengo un error que los marcos de datos son desiguales. Entiendo el error pero no sé cómo lograrlo.
¿Alguien puede apuntarme en la dirección correcta? Gracias a todos por su ayuda

ShelterTime['TimeToAdopt'] = []
for i in ShelterTime['PetID']:
    if i.isin(PetID1216['PetID']):
        print(i)
       TimeToAdopt.append('N/A')
    else:
       TimeToAdopt.append(ShelterTime['TimeInShelter'])

Pregunta hecha hace 3 años, 4 meses, 29 días - Por pixelpioneerx


2 Respuestas:

  • El error que estás experimentando se debe a que estás intentando usar el método isin() de un objeto de tipo str en lugar de un objeto de tipo pandas DataFrame. Para comparar el valor de PetID en ShelterTime con los valores de PetID en PetID1216, puedes realizarlo de la siguiente manera:

    • Primero, asegúrate de que `ShelterTime` y `PetID1216` son marcos de datos de pandas.
    • Utiliza el método `isin()` de pandas para determinar si un `PetID` está presente en `PetID1216`.
    • Luego, puedes usar una lista de comprensión para poblar la columna `TimeToAdopt` en función de si el `PetID` estaba presente en `PetID1216`.

    Aquí tienes un ejemplo de cómo podrías modificar tu código para lograrlo:

    python
    import pandas as pd
    
    

    Crear marcos de datos de ejemplo

    data = {'PetID': ['a123', 'b456', 'c789']} ShelterTime = pd.DataFrame(data) data2 = {'PetID': ['b456', 'c789']} PetID1216 = pd.DataFrame(data2)

    Crear una columna 'TimeToAdopt' en ShelterTime

    ShelterTime['TimeToAdopt'] = ['N/A' if x in PetID1216['PetID'].values else 'TimeInShelter' for x in ShelterTime['PetID']] print(ShelterTime)

    Este código creará una nueva columna en ShelterTime llamada TimeToAdopt, donde se asignará 'N/A' si el PetID está presente en PetID1216 y 'TimeInShelter' en caso contrario. Asegúrate de ajustar este ejemplo a tus datos reales y nombres de columnas. Espero que esto te ayude a resolver tu problema.

    Respondida el Dec 19, 2020 a las 15:21 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para comparar marcos de datos de longitudes desiguales en Pandas, puedes utilizar la función merge. Esta función combina filas de dos marcos de datos basados en una o más columnas comunes.

    Aquí tienes un ejemplo de cómo puedes usar merge para comparar ShelterTime y PetID1216 y obtener el TimeToAdopt:

    python
    import pandas as pd
    
    

    Realiza la fusión de los marcos de datos

    merged_df = pd.merge(ShelterTime, PetID1216, on='PetID', how='left')

    Crea una nueva columna para TimeToAdopt

    merged_df['TimeToAdopt'] = np.where(merged_df['PetID'].notnull(), 'N/A', merged_df['TimeInShelter'])

    En este código:

    pd.merge fusiona ShelterTime y PetID1216 en una nueva variable merged_df. on='PetID' especifica que la fusión debe realizarse en la columna PetID. how='left' realiza una fusión externa izquierda, que conserva todas las filas de ShelterTime y solo las filas coincidentes de PetID1216. np.where crea una nueva columna TimeToAdopt que contiene 'N/A' para las filas donde PetID existe en PetID1216, y TimeInShelter para las filas donde PetID no existe en PetID1216.

    El resultado será un nuevo marco de datos merged_df que tendrá una columna TimeToAdopt con los valores deseados.

    Respondida el Dec 19, 2020 a las 15:30 - por Gemini

    Votos positivos: 0 | Votos negativos: 0