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

时间:2020-02-15 03:04:22

标签: python 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()不适合我的用例,因为这是端口映射,需要保留起点。遍历数据框是个坏主意吗?

编辑后更加清晰

1 个答案:

答案 0 :(得分:3)

这有效:

(
    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列(EndLocationEndDeviceEndPort),而{ {1}}将分配给奇数行(1、3和5)的相同列。如果您有6行以上,则这些表达式将继续起作用。

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

由于Pandas会对齐分配中的索引,因此它只会根据要查看的表达式考虑偶数或奇数行。