使用 Pandas 合并数据框
Merging Dataframes using Pandas
我正在尝试将两个数据框合并在一起以创建一个简洁的数据框。第一个数据帧包含各种网络设备的所有可能名称。第二个数据框包含实际存在的网络设备的名称,以及它们对应的硬件。
我需要将这两个数据帧合并在一起,以便第一个数据帧中的设备名称与第二个数据帧中存在的设备名称 "checked",然后吐出相应的硬件以便进一步执行稍后分析。
这是我正在进行的操作的简化说明:
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 相互堆叠。甚至可以使用这种方法吗?
这就是我的管理方式,它需要两次合并!请记住,使用相同名称的多个列是有悖于良好做法的。
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
我用下面的例子(重命名列有点麻烦)得到了它,但这个例子很清楚。我使用您的示例数据框作为输入文件。此外,我使用了两个左连接并从 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
我正在尝试将两个数据框合并在一起以创建一个简洁的数据框。第一个数据帧包含各种网络设备的所有可能名称。第二个数据框包含实际存在的网络设备的名称,以及它们对应的硬件。
我需要将这两个数据帧合并在一起,以便第一个数据帧中的设备名称与第二个数据帧中存在的设备名称 "checked",然后吐出相应的硬件以便进一步执行稍后分析。
这是我正在进行的操作的简化说明:
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 相互堆叠。甚至可以使用这种方法吗?
这就是我的管理方式,它需要两次合并!请记住,使用相同名称的多个列是有悖于良好做法的。
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
我用下面的例子(重命名列有点麻烦)得到了它,但这个例子很清楚。我使用您的示例数据框作为输入文件。此外,我使用了两个左连接并从 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