Python Pandas: как добавить один фрейм данных во время итерации? - PullRequest
0 голосов
/ 06 июня 2019

Я ищу дамп конфигурации в формате Excel.

Я ищу совпадения IP-адресов, для которых я могу собрать новый кадр данных или список совпадающих строк.

До сих пор мне удавалось перебирать оба столбца IP-адресов, и когда они совпадают, ищите строку и присваивайте переменной.

Теперь я застрял, так как переменная, измененная с использованием метода изменения данных в pandas, похоже, не работает.

Затем я попытался добавить в обычный список только на этот раз, когда я знаю, что получаю больше информации, чем мне нужно:

68 0 Имя: следующий ссылочный индекс, dtype: int64

Мне бы хотелось помочь, пытаясь выяснить, как избавиться от лишних данных и сохранить только значения, или создать новый фрейм данных со всеми соответствиями для дальнейшей обработки.

# iterate through the two lists of ips and look for 
# duplicate values, if value is nan then skip
for line_1 in df_1['IPv4 address']:
    # ignore null lines
    if 'nan' in str(line_1):
        pass
        for line_2 in df_2['IPv4 address']:
            if 'nan' in str(line_2):
                pass
            # if the ip addresses match
            if line_1 == line_2:
                # look up the row in the dataframes ready for comparison
                result_1 = df_1.loc[df_1['IPv4 address'] == line_1]
                result_2 = df_2.loc[df_2['IPv4 address'] == line_2]

                # should I append the different details to a list?
                # or append to a dataframe? 
                # when appending to a dataframe it did not seem to work
                # and returned an empty dataframe
                result = (str(result_1['IP route name'])
                          + str(result_1['IPv4 address'])
                          + str(result_1['Next reference index']))
                results.append(result)

Я ожидаю, что на выходе будет либо новый фрейм данных со всеми совпадениями, либо список с каждой строкой, состоящей из 3 значений

# Example df

введите описание изображения здесь

1 Ответ

0 голосов
/ 06 июня 2019

Вы можете попробовать что-то вроде этого: Вы присоединяетесь к двум фреймам данных после переименования столбцов, а затем сравниваете непосредственно столбцы IPV4 с помощью фильтра панд, при этом извлекаются только те строки, которые вы хотите:

import pandas as pd
import numpy as np

df2 = pd.DataFrame(np.array([["ip_route1", "1.1.1.1",1], ["ip_route2", "2.2.2.2",2],["ip_route2", "4.3.3.4",3]]),columns=['IP_ROUTE', 'IPV4_AD','REF_INDEX'])
df1 = pd.DataFrame(np.array([["ip_route1", "1.1.1.1",1], ["ip_route2", "2.2.2.2",2], ["ip_route2", "3.3.3.3",3]]),columns=['IP_ROUTE', 'IPV4_AD','REF_INDEX'])

print(df1)
#     IP_ROUTE  IPV4_AD REF_INDEX
# 0  ip_route1  1.1.1.1         1
# 1  ip_route2  2.2.2.2         2
# 2  ip_route2  3.3.3.3         3

print(df2)
#     IP_ROUTE  IPV4_AD REF_INDEX
# 0  ip_route1  1.1.1.1         1
# 1  ip_route2  2.2.2.2         2
# 2  ip_route2  4.3.3.4         3

df1 = df1.rename(columns={"IPV4_AD": "IPV4_AD1", "IP_ROUTE":"IP_ROUTE_1"}).set_index("REF_INDEX")
df2 = df2.rename(columns={"IPV4_AD": "IPV4_AD2", "IP_ROUTE":"IP_ROUTE_2"}).set_index("REF_INDEX")

df = df1.join(df2).reset_index()

print(df)
#   REF_INDEX IP_ROUTE_1 IPV4_AD1 IP_ROUTE_2 IPV4_AD2
# 0         1  ip_route1  1.1.1.1  ip_route1  1.1.1.1
# 1         2  ip_route2  2.2.2.2  ip_route2  2.2.2.2
# 2         3  ip_route2  3.3.3.3  ip_route2  4.3.3.4

TempResult = df[df["IPV4_AD1"]==df["IPV4_AD2"]]
print(TempResult)
#   REF_INDEX IP_ROUTE_1 IPV4_AD1 IP_ROUTE_2 IPV4_AD2
# 0         1  ip_route1  1.1.1.1  ip_route1  1.1.1.1
# 1         2  ip_route2  2.2.2.2  ip_route2  2.2.2.2

result = TempResult[["IP_ROUTE_1","IPV4_AD1"]]
# .rename(columns={"IP_ROUTE_1","IP_ROUTE","IPV4_AD1","IPV4_AD"})
print(result)$
#   IP_ROUTE_1 IPV4_AD1
# 0  ip_route1  1.1.1.1
# 1  ip_route2  2.2.2.2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...