代码之家  ›  专栏  ›  技术社区  ›  AlexW

python pandas-用逻辑合并和重写?

  •  0
  • AlexW  · 技术社区  · 6 年前

    我有两个数据帧,数据相似,如下所示:

    样本表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
    

    我要做的是将列合并为覆盖,而不是切换…也就是说,如果存在一个MAC重复的MAC地址,并且它有一个路由器和一个交换机作为设备类型,我想从交换机中合并设备ID、端口和设备类型,并从路由器中删除数据。 如果不存在副本,请使用路由器中的数据。

    简单逻辑是否可能实现这一点,还是需要复杂的函数?

    1 回复  |  直到 6 年前
        1
  •  1
  •   w-m    6 年前

    您可以连接这两个数据帧,按设备类型对其排序,然后为每个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