【问题标题】:Merging Dataframes using Pandas使用 Pandas 合并数据框
【发布时间】:2020-05-22 20:52:32
【问题描述】:

我正在尝试将两个数据框合并在一起以创建一个简洁的数据框。第一个数据帧包含各种网络设备的所有可能名称。第二个数据帧包含实际存在的网络设备的名称,以及它们对应的硬件。

我需要将这两个数据帧合并在一起,以便将第一个数据帧中的设备名称与第二个数据帧中的设备名称进行“检查”,然后吐出相应的硬件,以便稍后进行进一步分析。

这是我正在做的事情的简化说明:


print(df1)

Router_Name     Firewall_Name       
0   router1     firewall1          
1   router2     firewall2          
2   router3     firewall3          
3   router4     firewall4

print(df2)

Device_Name     Hardware_Platform
0   router2         cisco111
1   router3         cisco222
2   firewall1       cisco333
3   firewall2       cisco444

这将是执行合并后我想要的结果:

print (df3)

Router_Name   Hardware_Platform  Firewall_Name    Hardware_Platform  
0   router1           N/A                firewall1        cisco333   
1   router2           cisco111           firewall2        cisco444
2   router3           cisco222           firewall3        N/A  
3   router4           N/A                firewall4        N/A



我尝试了很多命令,包括:

result = pd.concat([df1, df2], axis=1).reindex(df2.index)
print(result)

但这只会导致 df1 和 df2 相互堆叠。使用这种方法甚至可能吗?

【问题讨论】:

    标签: python pandas dataframe merge concat


    【解决方案1】:

    这就是我的管理方式,它需要两次合并!请记住,使用相同名称的多个列是违反良好做法的。

    import pandas as pd
    df1 = pd.DataFrame({'router_name':[1,2,3,4],'firewall':['firewall1','firewall2','firewall3','firewall4']})
    df2 = pd.DataFrame({'device_name':[2,3,'firewall1','firewall2'],'hardware':['cisco111','cisco222','cisco333','cisco444']})
    
    df3 = df1.merge(df2,how='left',left_on='router_name',right_on='device_name').merge(df2,how='left',left_on='firewall',right_on='device_name').drop(columns=[x for x in list(df3) if x.startswith('device')])
    print(df3)
    

    输出:

      router_name   firewall hardware_x hardware_y
    0           1  firewall1        NaN   cisco333
    1           2  firewall2   cisco111   cisco444
    2           3  firewall3   cisco222        NaN
    3           4  firewall4        NaN        NaN
    

    【讨论】:

      【解决方案2】:

      我得到了它与下面的例子一起工作(重命名列有点麻烦),但这个例子很清楚。我使用您的示例数据框作为输入文件。此外,我使用了两个左连接并从 hardware_platform 列创建了两列。

      第 1 步:创建数据框

      import pandas as pd
      
      df1 = pd.read_excel('file1.xlsx')
      df2 = pd.read_excel('file2.xlsx')
      
        router_name firewall_name
      0     router1     firewall1
      1     router2     firewall2
      2     router3     firewall3
      3     router4     firewall4
      
        device_name hardware_platform
      0     router2          cisco111
      1     router3          cisco222
      2   firewall1          cisco333
      3   firewall2          cisco444
      

      第 2 步:首先合并(路由器)

      df2 = df2.rename(columns={"device_name": "router_name"})
      m1 = pd.merge(df1, df2, on='router_name', how='left')
      m1 = m1.rename(columns={"hardware_platform": "router_hardware"})
      
        router_name firewall_name router_hardware
      0     router1     firewall1             NaN
      1     router2     firewall2        cisco111
      2     router3     firewall3        cisco222
      3     router4     firewall4             NaN
      

      第 3 步:第二次合并(防火墙)

      df2 = df2.rename(columns={"router_name": "firewall_name"})
      m2 = pd.merge(m1, df2, on='firewall_name', how='left')
      
        router_name firewall_name router_hardware firewall_hardware
      0     router1     firewall1             NaN          cisco333
      1     router2     firewall2        cisco111          cisco444
      2     router3     firewall3        cisco222               NaN
      3     router4     firewall4             NaN               NaN
      

      【讨论】:

        猜你喜欢
        • 2017-07-10
        • 2020-02-19
        • 2021-06-25
        • 1970-01-01
        • 2014-12-06
        • 1970-01-01
        • 2022-11-13
        • 2021-12-14
        • 2015-10-17
        相关资源
        最近更新 更多