次の行と3列のパンダスワップ値

2020-02-15 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()はポートマッピングであり、開始点を保持する必要があるため、私のユースケースに適合しません。データフレームをループするのは悪い考えですか?

より明確にするために編集

Answers

これは動作します:

(
    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]は偶数行( EndPort )の列EndPortEndLocationEndDeviceEndPort )にdf.iloc[1::2, 3:6]df.iloc[1::2, 3:6]は奇数行(1、3、5)の同じ列に割り当てられます。6行を超える場合、これらの式は機能し続けます。

割り当てる値には、2つのシフト式を使用します。1つは上にシフトし、偶数行(1-> 0、3-> 2、5-> 4)に使用し、もう1つは奇数行にシフトダウン(0-> 1 、2-> 3および4-> 5)、再び列3、4および5のみを選択します。

Pandasは割り当てのインデックスを揃えるため、どの式を見ているかに応じて偶数行または奇数行のみを考慮します。

Related