I am using pyATS to gather information about a device's ARP table. The output is a dictionary-like object which I have managed to turn into a table by using pandas.
I now have the following table in pandas:
interface neighbor ip link_layer_address type origin age protocol
0 GigabitEthernet1 10.122.41.129 10.122.41.129 NaN NaN NaN NaN NaN
1 GigabitEthernet1 10.122.41.129 NaN 001a.6c78.e7ff NaN NaN NaN NaN
2 GigabitEthernet1 10.122.41.129 NaN NaN ARPA NaN NaN NaN
3 GigabitEthernet1 10.122.41.129 NaN NaN NaN dynamic NaN NaN
4 GigabitEthernet1 10.122.41.129 NaN NaN NaN NaN 47 NaN
5 GigabitEthernet1 10.122.41.129 NaN NaN NaN NaN NaN Internet
6 GigabitEthernet1 10.122.41.169 10.122.41.169 NaN NaN NaN NaN NaN
7 GigabitEthernet1 10.122.41.169 NaN 0050.569f.840b NaN NaN NaN NaN
8 GigabitEthernet1 10.122.41.169 NaN NaN ARPA NaN NaN NaN
9 GigabitEthernet1 10.122.41.169 NaN NaN NaN static NaN NaN
10 GigabitEthernet1 10.122.41.169 NaN NaN NaN NaN - NaN
11 GigabitEthernet1 10.122.41.169 NaN NaN NaN NaN NaN Internet
12 GigabitEthernet1 10.122.41.171 10.122.41.171 NaN NaN NaN NaN NaN
13 GigabitEthernet1 10.122.41.171 NaN 0050.569f.7e22 NaN NaN NaN NaN
14 GigabitEthernet1 10.122.41.171 NaN NaN ARPA NaN NaN NaN
15 GigabitEthernet1 10.122.41.171 NaN NaN NaN dynamic NaN NaN
16 GigabitEthernet1 10.122.41.171 NaN NaN NaN NaN 208 NaN
17 GigabitEthernet1 10.122.41.171 NaN NaN NaN NaN NaN Internet
18 GigabitEthernet1 10.122.41.186 10.122.41.186 NaN NaN NaN NaN NaN
19 GigabitEthernet1 10.122.41.186 NaN 0050.569f.3343 NaN NaN NaN NaN
20 GigabitEthernet1 10.122.41.186 NaN NaN ARPA NaN NaN NaN
21 GigabitEthernet1 10.122.41.186 NaN NaN NaN dynamic NaN NaN
22 GigabitEthernet1 10.122.41.186 NaN NaN NaN NaN 228 NaN
23 GigabitEthernet1 10.122.41.186 NaN NaN NaN NaN NaN Internet
24 GigabitEthernet2 172.20.3.14 172.20.3.14 NaN NaN NaN NaN NaN
25 GigabitEthernet2 172.20.3.14 NaN 0050.569f.0e3d NaN NaN NaN NaN
26 GigabitEthernet2 172.20.3.14 NaN NaN ARPA NaN NaN NaN
27 GigabitEthernet2 172.20.3.14 NaN NaN NaN static NaN NaN
28 GigabitEthernet2 172.20.3.14 NaN NaN NaN NaN - NaN
29 GigabitEthernet2 172.20.3.14 NaN NaN NaN NaN NaN Internet
30 GigabitEthernet2 172.20.3.15 172.20.3.15 NaN NaN NaN NaN NaN
31 GigabitEthernet2 172.20.3.15 NaN 0050.569f.2637 NaN NaN NaN NaN
32 GigabitEthernet2 172.20.3.15 NaN NaN ARPA NaN NaN NaN
33 GigabitEthernet2 172.20.3.15 NaN NaN NaN dynamic NaN NaN
34 GigabitEthernet2 172.20.3.15 NaN NaN NaN NaN 84 NaN
35 GigabitEthernet2 172.20.3.15 NaN NaN NaN NaN NaN Internet
36 GigabitEthernet2 172.20.3.16 172.20.3.16 NaN NaN NaN NaN NaN
37 GigabitEthernet2 172.20.3.16 NaN 0050.569f.98f8 NaN NaN NaN NaN
38 GigabitEthernet2 172.20.3.16 NaN NaN ARPA NaN NaN NaN
39 GigabitEthernet2 172.20.3.16 NaN NaN NaN dynamic NaN NaN
40 GigabitEthernet2 172.20.3.16 NaN NaN NaN NaN 73 NaN
41 GigabitEthernet2 172.20.3.16 NaN NaN NaN NaN NaN Internet
42 GigabitEthernet2 172.20.3.17 172.20.3.17 NaN NaN NaN NaN NaN
43 GigabitEthernet2 172.20.3.17 NaN 0050.569f.1b6f NaN NaN NaN NaN
44 GigabitEthernet2 172.20.3.17 NaN NaN ARPA NaN NaN NaN
45 GigabitEthernet2 172.20.3.17 NaN NaN NaN dynamic NaN NaN
46 GigabitEthernet2 172.20.3.17 NaN NaN NaN NaN 128 NaN
47 GigabitEthernet2 172.20.3.17 NaN NaN NaN NaN NaN Internet
48 GigabitEthernet2 172.20.3.18 172.20.3.18 NaN NaN NaN NaN NaN
49 GigabitEthernet2 172.20.3.18 NaN 0050.569f.2ac9 NaN NaN NaN NaN
50 GigabitEthernet2 172.20.3.18 NaN NaN ARPA NaN NaN NaN
51 GigabitEthernet2 172.20.3.18 NaN NaN NaN dynamic NaN NaN
52 GigabitEthernet2 172.20.3.18 NaN NaN NaN NaN 109 NaN
53 GigabitEthernet2 172.20.3.18 NaN NaN NaN NaN NaN Internet
54 GigabitEthernet2 172.20.3.250 172.20.3.250 NaN NaN NaN NaN NaN
55 GigabitEthernet2 172.20.3.250 NaN 0050.569f.ed6d NaN NaN NaN NaN
56 GigabitEthernet2 172.20.3.250 NaN NaN ARPA NaN NaN NaN
57 GigabitEthernet2 172.20.3.250 NaN NaN NaN dynamic NaN NaN
58 GigabitEthernet2 172.20.3.250 NaN NaN NaN NaN 235 NaN
59 GigabitEthernet2 172.20.3.250 NaN NaN NaN NaN NaN Internet
I want to turn it into:
interface neighbor ip link_layer_address type origin age protocol
0 GigabitEthernet1 10.122.41.129 10.122.41.129 001a.6c78.e7ff ARPA dynamic 47 Internet
6 GigabitEthernet1 10.122.41.169 10.122.41.169 0050.569f.840b ARPA static - Internet
12 GigabitEthernet1 10.122.41.171 10.122.41.171 0050.569f.7e22 ARPA dynamic 208 Internet
...
54 GigabitEthernet2 172.20.3.250 172.20.3.250 0050.569f.ed6d ARPA dynamic 235 Internet
I have tried multiple alternatives but have not been able to develop a programmatic way to do it.
CodePudding user response:
df.groupby('neighbor').first().reset_index()
neighbor interface ip link_layer_address type origin age protocol
0 10.122.41.129 GigabitEthernet1 10.122.41.129 001a.6c78.e7ff ARPA dynamic 47 Internet
1 10.122.41.169 GigabitEthernet1 10.122.41.169 0050.569f.840b ARPA static - Internet
2 10.122.41.171 GigabitEthernet1 10.122.41.171 0050.569f.7e22 ARPA dynamic 208 Internet
3 10.122.41.186 GigabitEthernet1 10.122.41.186 0050.569f.3343 ARPA dynamic 228 Internet
4 172.20.3.14 GigabitEthernet2 172.20.3.14 0050.569f.0e3d ARPA static - Internet
5 172.20.3.15 GigabitEthernet2 172.20.3.15 0050.569f.2637 ARPA dynamic 84 Internet
6 172.20.3.16 GigabitEthernet2 172.20.3.16 0050.569f.98f8 ARPA dynamic 73 Internet
7 172.20.3.17 GigabitEthernet2 172.20.3.17 0050.569f.1b6f ARPA dynamic 128 Internet
8 172.20.3.18 GigabitEthernet2 172.20.3.18 0050.569f.2ac9 ARPA dynamic 109 Internet
9 172.20.3.250 GigabitEthernet2 172.20.3.250 0050.569f.ed6d ARPA dynamic 235 Internet
This gives the same result:
df.groupby('neighbor').last().reset_index()