Python 熊猫将3列的值与下一行交换
我正在使用pandas数据帧,希望将一行中3列[EndLocation,EndDevice,EndPort]的值与下一行交换,然后下一行成为第一行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
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列
因为熊猫将在一个赋值中对齐索引,它只考虑它所看到的表达式的偶数或奇数行。
这是你的数据实际上是什么样子的?根据位置,列名是否保持不变?您需要这样做是为了什么?您的数据实际上是这样的吗?根据位置,列名是否保持不变?你为什么要这么做?谢谢你。非常好,谢谢你的解释,谢谢菲尔布兰登。很好,谢谢你的解释