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 – cómo guardar atributos en un array y preservar sus valores en nuevas columnas

Tengo un dataframe que tiene los atributos “key”, “name” y “value”. Para cada grupo de “key”, quiero que los atributos “name” se guarden en un array. El valor de cada nombre se guardaría entonces en su propia columna llamada “_value”. Por ejemplo:

key name value
0 A Patton 2
1 A Arthur 2
2 B Will 1
3 B Patton 1

El dataframe anterior debería transformarse de la siguiente manera:

key name Patton_value Arthur_value Will_value
0 A [Patton, Arthur] 2 2 null
1 B [Patton, Will] 1 null 1

Lo que he intentado hasta ahora es:

df.groupby(‘key’).name.apply(list).reset_index()

Pero no sé cómo preservar los valores para el atributo “name” y guardarlos como una columna.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener el resultado deseado, puedes utilizar una combinación de las funciones pivot_table y groupby de pandas de la siguiente manera:

    df_pivot = pd.pivot_table(df, index='key', columns='name', values='value', aggfunc=np.sum)
    df_grouped = df.groupby('key')['name'].apply(list).reset_index()
    df_final = pd.merge(df_grouped, df_pivot, on='key').fillna(value=np.nan)
    df_final.columns = ['key', 'name', *[f"{col}_value" for col in df_pivot.columns]]
    

    Desglosemos cada paso:

    1. pd.pivot_table: Esta función se utiliza para crear una tabla pivote a partir del dataframe original, de manera que cada combinación única de key y name se convierte en una fila separada, y el valor correspondiente es el valor de la celda. Esto da como resultado un dataframe como el siguiente:
      name  Arthur  Patton  Will
      key                       
      A       2.0     2.0   NaN
      B       NaN     1.0   1.0
      
    2. df.groupby: Esta función agrupa el dataframe original por key y crea una nueva columna name que es una lista de todos los valores de name en cada grupo. Esto da como resultado un dataframe como el siguiente:
      key              name
      0   A  [Patton, Arthur]
      1   B    [Patton, Will]
      
    3. pd.merge: Esta función fusiona los dos dataframes creados en los pasos 1 y 2 en base a la columna común key. Esto garantiza que la lista name y las columnas value correspondientes estén alineadas para cada key único. El dataframe resultante es el siguiente:
      key              name  Arthur  Patton  Will
      0   A  [Patton, Arthur]     2.0     2.0   NaN
      1   B    [Patton, Will]     NaN     1.0   1.0
      
    4. fillna: Esta función reemplaza todos los valores NaN en el dataframe por np.nan para que la salida final sea consistente.
    5. df_final.columns: Esta línea de código renombra las columnas para facilitar la comprensión, de la siguiente manera:

      ['key', 'name', 'Patton_value', 'Arthur_value', 'Will_value']
      

    Esto nos proporciona el resultado deseado según se especifica en la pregunta.

Comments are closed.