Pandas Swap ค่า 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() ไม่เหมาะกับกรณีการใช้งานของฉันเพราะนี่คือการจับคู่พอร์ตและต้องรักษาจุดเริ่มต้นไว้ การวนซ้ำผ่าน dataframe เป็นความคิดที่ไม่ดีหรือไม่?

แก้ไขเพื่อความชัดเจนมากขึ้น

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],
)

มันใช้การมอบหมาย tuple ของ Python เพื่อกำหนดทั้งแถวคู่และคี่ในเวลาเดียวกัน

df.iloc[0::2, 3:6] จะกำหนดให้กับคอลัมน์ 3, 4 และ 5 ( EndLocation , EndDevice และ EndPort ) ของแถวคู่ (0, 2 และ 4) ในขณะที่ 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

เนื่องจาก Pandas จะจัดแนวดัชนีในการกำหนดค่ามันจะพิจารณาเฉพาะแถวคู่หรือคี่ขึ้นอยู่กับนิพจน์ที่ดูอยู่

Related