python pandas-合并和覆盖逻辑?

时间:2018-07-23 16:32:18

标签: python pandas merge

我有两个数据帧,数据如下:

示例表1:

device_id device_type     ip_address     mac_address     port  vlan
       89      Router   10.10.10.13  ad3d.bb39.484a     None   5.0
       89      Router   10.10.10.21  0010.1d1a.7b67     None   5.0
       89      Router   10.10.10.22  0010.4d5a.768d     None   5.0
       89      Router   10.10.10.23  0010.096a.7a8c     None   5.0

示例表2:

device_id device_type     mac_address      port
      305      Switch  ad3d.bb39.484a   Gi1/0/3
      305      Switch  0010.1d1a.7b67   Gi1/0/4
      305      Switch  0010.4d5a.768d   Gi1/0/2
      305      Switch  9a72.2dad.21f0  Gi1/0/22

我想在Mac地址上合并这两项,目前已通过

完成
temp_merged_data = arp_data.merge(mac_data, on='mac_address', how='left')

这给出了数据

device_id_x device_type_x   ip_address     mac_address     port_x  vlan  device_id_y  device_type_y      port_y 
         89      Router     10.10.10.13  ad3d.bb39.484a      None   5.0          305         Router     Gi1/0/3
         89      Router     10.10.10.21  0010.1d1a.7b67      None   5.0          305         Router     Gi1/0/4
         89      Router     10.10.10.22  0010.4d5a.768d      None   5.0          305         Router     Gi1/0/2
         89      Router     10.10.10.23  0010.096a.7a8c      None   5.0          305         Router    Gi1/0/22

我想做的是优先使用switch合并带有覆盖的列...即,如果存在Mac重复的Mac地址,并且它具有作为device_type的路由器和交换机,我想合并device_id,port ,以及来自交换机的device_type并从路由器中删除数据。 如果不存在重复项,请使用路由器中的数据。

这是否可能通过简单的逻辑还是需要复杂的功能?

1 个答案:

答案 0 :(得分:1)

您可以将两个数据帧连接起来,按设备类型对其进行排序,然后为每个mac地址选择第一个条目:

>>> pd.concat([arp_data, mac_data]) \
      .sort_values("device_type", ascending=False) \
      .groupby("mac_address").first() \
      .reset_index()

      mac_address  device_id device_type   ip_address      port  vlan
0  0010.096a.7a8c         89      Router  10.10.10.23      None   5.0
1  0010.1d1a.7b67        305      Switch  10.10.10.21   Gi1/0/4   5.0
2  0010.4d5a.768d        305      Switch  10.10.10.22   Gi1/0/2   5.0
3  9a72.2dad.21f0        305      Switch          NaN  Gi1/0/22   NaN
4  ad3d.bb39.484a        305      Switch  10.10.10.13   Gi1/0/3   5.0