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.

¿Cómo transponer dos columnas particulares y mantener la primera fila en Python?

Tengo el marco de datos de la siguiente manera:

df = pd.DataFrame({
‘ID’: [12, 12, 15, 15, 16, 17, 17],
‘Name’: [‘A’, ‘A’, ‘B’, ‘B’, ‘C’, ‘D’, ‘D’],
‘Date’:[‘2019-12-20′ ,’2018-12-20′ ,’2017-12-20’ , ‘2016-12-20’, ‘2015-12-20’, ‘2014-12-20’, ‘2013-12-20’],
‘Color’:[‘Black’, ‘Blue’, ‘Red’ , ‘Yellow’ , ‘White’ , ‘Sky’ , ‘Green’]
})

o tabla de datos:

ID Name Date Color
0 12 A 2019-12-20 Black
1 12 A 2018-12-20 Blue
2 15 B 2017-12-20 Red
3 15 B 2016-12-20 Yellow
4 16 C 2015-12-20 White
5 17 D 2014-12-20 Sky
6 17 D 2013-12-20 Green

Mi resultado deseado sería la siguiente tabla. ¿Cómo podría lograr eso?

ID Name Date Color Date_ Color_

0 12 A 2019-12-20 Black 2018-12-20 Blue
1 15 B 2017-12-20 Red 2016-12-20 Yellow
2 16 C 2015-12-20 White 2015-12-20 White
3 17 D 2014-12-20 Sky 2013-12-20 Green

Necesito tu ayuda, ¡gracias de antemano!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener el resultado deseado, se puede utilizar la función groupby para agrupar por las columnas ID y Name, y luego usar la función shift para crear nuevas columnas con los valores de las filas anteriores. Por último, se pueden eliminar las filas duplicadas utilizando la función drop_duplicates.

    Aquí está el código para lograr el resultado deseado:

    df['Date_'] = df.groupby(['ID', 'Name'])['Date'].shift(1)
    df['Color_'] = df.groupby(['ID', 'Name'])['Color'].shift(1)
    df.drop_duplicates(subset=['ID', 'Name', 'Date', 'Color'], keep='last', inplace=True)
    

    El marco de datos resultante sería:

       ID Name        Date   Color       Date_ Color_
    0  12    A  2019-12-20   Black  2018-12-20   Blue
    2  15    B  2017-12-20     Red  2016-12-20  Yellow
    4  16    C  2015-12-20   White  2015-12-20  White
    6  17    D  2013-12-20   Green  2014-12-20    Sky
    

Comments are closed.