Python 熊猫将3列的值与下一行交换

Python 熊猫将3列的值与下一行交换,python,pandas,Python,Pandas,我正在使用pandas数据帧,希望将一行中3列[EndLocation,EndDevice,EndPort]的值与下一行交换,然后下一行成为第一行 StartLocation StartDevice StartPort EndLocation EndDevice EndPort LinkType \ 0 DD1 Switch1 P1 AD1 Switch2 P2 MTP 1 AB11

我正在使用pandas数据帧,希望将一行中3列[EndLocation,EndDevice,EndPort]的值与下一行交换,然后下一行成为第一行

  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 
预期产出:

    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和np.roll不适合我的用例,因为这是端口映射,需要保留起点。通过数据帧循环是个坏主意吗

为更清晰起见进行了编辑

此功能:

(
    df.iloc[0::2, 3:6],
    df.iloc[1::2, 3:6],
) = (
    df.shift(-1).iloc[:, 3:6], 
    df.shift(1).iloc[:, 3:6],
)
它使用Python的元组分配同时分配偶数行和奇数行

df.iloc[0::2,3:6]将分配给偶数行0,2和4的第3,4和5列EndLocation,EndDevice和EndPort,而df.iloc[1::2,3:6]将分配给奇数行1,3和5上的相同列。如果有6行以上,这些表达式将继续工作

对于要分配的值,我们使用两个移位表达式,一个上移,用于偶数行1->0、3->2、5->4,另一个下移,用于奇数行0->1、2->3和4->5,同样只选择第3、4和5列

由于熊猫将在一个赋值中对齐索引,它只考虑它所观察到的表达式的偶数或奇数行。

< P>:
(
    df.iloc[0::2, 3:6],
    df.iloc[1::2, 3:6],
) = (
    df.shift(-1).iloc[:, 3:6], 
    df.shift(1).iloc[:, 3:6],
)
它使用Python的元组分配同时分配偶数行和奇数行

df.iloc[0::2,3:6]将分配给偶数行0,2和4的第3,4和5列EndLocation,EndDevice和EndPort,而df.iloc[1::2,3:6]将分配给奇数行1,3和5上的相同列。如果有6行以上,这些表达式将继续工作

对于要分配的值,我们使用两个移位表达式,一个上移,用于偶数行1->0、3->2、5->4,另一个下移,用于奇数行0->1、2->3和4->5,同样只选择第3、4和5列


因为熊猫将在一个赋值中对齐索引,它只考虑它所看到的表达式的偶数或奇数行。

这是你的数据实际上是什么样子的?根据位置,列名是否保持不变?您需要这样做是为了什么?您的数据实际上是这样的吗?根据位置,列名是否保持不变?你为什么要这么做?谢谢你。非常好,谢谢你的解释,谢谢菲尔布兰登。很好,谢谢你的解释