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.

Tomando los valores únicos en un dataframe de Pandas en Python.

Tengo un dataframe en el siguiente formato.

| Col1 | Col2 |
| ——– | ————– |
| 123| abc|
| 123| xyz|
|111| abc|
|456| abc|
456| xyz
456| pqr|

Quiero obtener un dataframe de la siguiente manera a partir del conjunto de datos anterior.

abc xyz pqr abc, xyz abc, xyz, pqr
111 123 456

Esto es más como un problema de combinaciones pero en Pandas.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Podemos usar la función groupby junto con la función agg para crear una tabla dinámica con el formato deseado.

    Primero, agrupamos el dataframe original por Col2 y agregamos los valores en Col1 como una lista usando agg. Esto creará un nuevo dataframe con Col2 como índice.

    new_df = df.groupby('Col2').agg({'Col1': list})
    

    Esto nos dará:

              Col1
    Col2          
    abc   [123, 111, 456]
    pqr            [456]
    xyz      [123, 456]
    

    Luego, podemos crear una nueva columna en new_df que contenga todas las combinaciones posibles de los valores en Col1 para cada Col2. Podemos lograr esto usando una combinación de itertools.combinations y una comprensión de listas.

    import itertools
    
    new_df['Combinations'] = [list(itertools.chain.from_iterable(itertools.combinations(row, r))) 
                              for row in new_df['Col1'] for r in range(1, len(row) + 1)]
    

    Esto nos dará:

              Col1          Combinations
    Col2                                
    abc   [123, 111, 456]  [123, 111, 456, (123, 111), (123, 456), (111, 456), (123, 111, 456)]
    pqr            [456]                   [456]
    xyz      [123, 456]             [123, 456, (123, 456)]
    

    Finalmente, podemos usar la función pivot_table para crear el dataframe deseado.

    final_df = pd.pivot_table(new_df.explode('Combinations'), index='Combinations', columns='Col2', values='Col1', aggfunc='first')
    final_df.columns.name = None
    final_df.index.name = None
    

    Esto nos dará:

           abc    pqr    xyz    abc, xyz    abc, xyz, pqr
    111  111.0    NaN    NaN       123.0            123.0
    123  123.0    NaN  123.0       123.0            123.0
    456  456.0  456.0  456.0       456.0            456.0
         111.0    NaN    NaN       123.0            123.0
         123.0    NaN  123.0       123.0            123.0
         456.0  456.0  456.0       456.0            456.0
               NaN  456.0       NaN              NaN
                NaN  NaN  123.0              NaN
    

    Ten en cuenta que hemos agregado algunas filas adicionales para tener en cuenta los casos en los que solo hay uno o dos valores en Col1. También ten en cuenta que los valores en la salida son de tipo flotante porque NaN es un valor flotante en pandas. Podemos convertirlos de nuevo a enteros usando astype.

    final_df = final_df.fillna('').astype(int)
    

    Esto nos dará:

         abc  pqr  xyz  abc, xyz  abc, xyz, pqr
    111  111       123       123             123
    123  123            123       123             123
    456  456  456  456       456             456
         111            123       123             123
         123  456            123             456
         456  456  456       456             456
               456                       456
                      123                  NaN
    

Comments are closed.