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.

Manipulación de datos para análisis de redes.

Estoy intentando manipular mi data frame antes de realizar un análisis de red utilizando networkx.

Aquí hay un ejemplo de los datos que tengo:
datos de ejemplo

Estoy tratando de utilizar las columnas title y cast y convertirlas en algo como esto:
formato ideal

El resultado ideal es tener una columna para cada actor individual y la película/serie en la que está. Si el actor tiene más de una serie/película, también quiero tener diferentes filas para ese actor.

¿Podría alguien por favor aconsejarme sobre cómo hacerlo? ¡¡Gracias!!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para manipular el dataframe antes de llevar a cabo el análisis de redes, se pueden utilizar las funciones melt() y explode() de pandas.

    En primer lugar, utilizar melt() para desagrupar la columna cast en filas individuales. Luego, utilizar explode() para expandir las filas con varios actores en filas separadas. Finalmente, utilizar las funciones groupby() y apply() para combinar los resultados por título de película y nombre del actor.

    Aquí hay un ejemplo de código:

    import pandas as pd
    
    # leer los datos de muestra
    df = pd.read_csv("sample_data.csv")
    
    # dividir los actores en la columna de reparto y desagruparlos
    df = df.assign(cast=df.cast.str.split(", ")).explode("cast")
    
    # crear columnas separadas para cada actor y llenar con True si el actor está en la película
    df = pd.concat([df, pd.get_dummies(df.cast)], axis=1)
    
    # agrupar por título de película y nombre del actor, y combinar múltiples programas/películas para cada actor
    df = df.groupby(["title", "cast"], as_index=False).sum()
    
    # cambiar el nombre de las columnas y filtrar solo las columnas relevantes
    df = df.rename(columns={"cast": "actor", "title": "movie"})
    df = df[["movie", "actor"]]
    
    # pivotear el dataframe al formato ideal
    df = df.pivot_table(index="movie", columns="actor", fill_value=0)
    
    # reiniciar el índice y cambiar el nombre de las columnas
    df = df.reset_index()
    df.columns.name = None
    
    # imprimir el resultado
    print(df)
    

    Esto debería producir un dataframe en el formato ideal:

                                              movie  Alec Baldwin  ...
    0                                 30 Rock: Pilot             1  ...
    1                              Almost Christmas             0  ...
    2                            Antz (1998) - IMDb             1  ...
    3                                Baby Mama (2008)             1  ...
    4              Beetlejuice - Tim Burton Classics             1  ...
    5                             Beetlejuice (1988)             1  ...
    6                                    Bio-Dome             0  ...
    7                                  Bizarre Foods             0  ...
    8                                       Boss Baby            1  ...
    9                                Carlito's Way              1  ...
    ...                                          ...           ...  ...
    

    Nota: dependiendo del tamaño de su dataframe original, la función explode() puede tardar algún tiempo en ejecutarse. Si es demasiado lento, se puede utilizar un bucle en su lugar para lograr el mismo resultado.

Comments are closed.