Слияние фреймов данных с использованием Pandas - PullRequest
3 голосов
/ 06 февраля 2020

Я пытаюсь объединить два кадра данных, чтобы создать один краткий кадр данных. Первый фрейм данных содержит все возможные имена различных сетевых устройств. Второй фрейм данных содержит имена реально существующих сетевых устройств, а также соответствующее оборудование.

Мне нужно объединить эти два фрейма данных, чтобы имена устройств в первом фрейме данных были «проверены» на соответствие существующим. во втором информационном кадре, а затем выплюнуть соответствующее аппаратное обеспечение, чтобы выполнить дальнейший анализ позже.

Вот упрощенная иллюстрация того, что у меня происходит:


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 накладываются друг на друга. Возможно ли использование этого метода?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Я работал со следующим примером (довольно громоздко с переименованием столбцов), но пример достаточно ясен. Я использовал ваши примеры данных в качестве входных файлов. Кроме того, я использовал два левых объединения и создал два столбца из столбца 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
0 голосов
/ 06 февраля 2020

Вот так мне и удалось, потребовалось два слияния! Имейте в виду, что не рекомендуется использовать несколько столбцов с одинаковым именем.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...