我正在使用熊猫数据框,并希望将一行中的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()
不适合我的用例,因为这是端口映射,需要保留起点。遍历数据框是个坏主意吗?
编辑后更加清晰
答案 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列(EndLocation
,EndDevice
和EndPort
),而{ {1}}将分配给奇数行(1、3和5)的相同列。如果您有6行以上,则这些表达式将继续起作用。
对于要分配的值,我们使用两个移位表达式,一个向上移位,偶数行(1-> 0,3-> 2,5-> 4),另一个向下移位奇数行(0 -> 1、2-> 3和4-> 5),再次仅选择第3、4和5列。
由于Pandas会对齐分配中的索引,因此它只会根据要查看的表达式考虑偶数或奇数行。