Valores de intercambio de pandas de 3 columnas con la siguiente fila

2020-02-15 python pandas

Estoy usando un marco de datos de pandas y quiero intercambiar los valores de 3 columnas [EndLocation, EndDevice, EndPort] en una fila con la siguiente fila, la siguiente fila se convierte en la primera fila.

  StartLocation StartDevice StartPort EndLocation EndDevice EndPort LinkType  \
0           DD1     Switch1        P1         AD1   Switch2      P2      MTP   
1          AB11        RU15        P1        AJ11      RU25      P1      NaN   
2           DD2     Switch2        P3         AD2   Switch3      P2      MTP   
3          AB12        RU18        P2        AB11      RU35      P3      NaN   
4           DD3     Switch3        P5         AD3   Switch4      P6      MTP   
5          AB13        RU19        P3        AB11      RU40      P4      NaN 

Rendimiento esperado:

    StartLocation StartDevice StartPort EndLocation EndDevice EndPort LinkType  \
0           DD1     Switch1        P1         AJ11   RU25        P1      MTP   
1          AB11        RU15        P1         AD1    Switch2     P2      NaN   
2           DD2     Switch2        P3         AB11    RU35       P3      MTP   
3          AB12        RU18        P2        AD2    Switch3     P2      NaN   
4           DD3     Switch3        P5        AB11    RU40        P4      MTP   
5          AB13        RU19        P3        AD3   Switch4      P6      NaN 

shift() y np.roll() no se ajustan a mi caso de uso ya que este es un mapeo de puertos y necesita preservar el punto de inicio. ¿Recorrer un marco de datos es una mala idea?

Editado para mayor claridad.

Answers

Esto funciona:

(
    df.iloc[0::2, 3:6],
    df.iloc[1::2, 3:6],
) = (
    df.shift(-1).iloc[:, 3:6], 
    df.shift(1).iloc[:, 3:6],
)

Utiliza la asignación de tuplas de Python para asignar tanto filas pares como impares al mismo tiempo.

df.iloc[0::2, 3:6] asignará a las columnas 3, 4 y 5 ( EndLocation , EndDevice y EndPort ) de las filas pares (0, 2 y 4), mientras que df.iloc[1::2, 3:6] se asignará a las mismas columnas en filas impares (1, 3 y 5.) Si tiene más de 6 filas, estas expresiones seguirán funcionando.

Para los valores a asignar, utilizamos dos expresiones de desplazamiento, una hacia arriba para las filas pares (1 -> 0, 3 -> 2, 5 -> 4) y la otra hacia abajo para las filas impares (0 -> 1 , 2 -> 3 y 4 -> 5), seleccionando nuevamente solo las columnas 3, 4 y 5.

Dado que Pandas alineará el índice en una asignación, solo considerará las filas pares o impares según la expresión que esté mirando.

Related