Панды объединяют строки внутри одного кадра данных - PullRequest
0 голосов
/ 25 ноября 2018

Новичок в Пандах, и у меня есть вопрос, на который я не могу ответить самостоятельно.Для контекста это вывод из брандмауэра.он генерирует миллионы пакетов, и я пытаюсь объединить эти данные в набор правил брандмауэра.Лучший способ, с помощью которого я пришел, - это определить трафик на основе IP-адреса назначения.

Порты source / dest изменятся, если они будут эфемерными, поэтому важно, чтобы я собрал их в одну строку.Таким образом, я могу определить диапазон портов для набора правил.

RAW CSV:

dvc, "src_interface", transport, "src_ip", "src_port "," dest_ip "," dest_port ", направление, действие, причина, счет" Firewall-1 ", снаружи, tcp," 4.4.4.4 ", 53," 1.1.1.1 ", 1025, исходящий, разрешен," ", 2 «Брандмауэр-1», снаружи, tcp, «4.4.4.4», 53, «1.1.1.1», 1026, исходящий, разрешен, «», 2 «Брандмауэр-1», снаружи, tcp, «4.4.4.4", 22," 1.1.1.1 ", 1028, исходящий, разрешенный," ", 2" Брандмауэр-1 ", снаружи, tcp," 3.3.3.3 ", 22," 2.2.2.2 ", 2200, исходящий, разрешенный,"", 2

Фрейм данных:

dvc src_interface transport   src_ip  src_port        dest_ip  dest_port direction   action  cause  count
0  Firewall-1       outside       tcp  4.4.4.4       53  1.1.1.1       1025  outbound  allowed    NaN      2
1  Firewall-1       outside       tcp  4.4.4.4       53  1.1.1.1       1026  outbound  allowed    NaN      2
2  Firewall-1       outside       tcp  4.4.4.4       53  1.1.1.1       1028  outbound  allowed    NaN      2
3  Firewall-1       outside       tcp  3.3.3.3       22  2.2.2.2       2200  outbound  allowed    NaN      2

Как мне объединить строки с одним и тем же dest_ip?

CODE:

df = pd.concat([pd.read_csv(f) for f in glob.glob('*.csv')], ignore_index = True)
index_cols = df.columns.tolist()
index_cols.remove('dest_ip')
df = df.groupby(index_cols, as_index=False)['dest_ip'].apply(list)
print(df)

Ожидаемый результат:

Firewall-1 outside tcp 4.4.4.4 53 1.1.1.1 1025-1026,1028 outbound allowed nan 2
Firewall-1 outside tcp 3.3.3.3 22 2.2.2.2 2200 outbound allowed nan 2

Большинство примеров, которые я нашел в Интернете, включают объединение двух фреймов данных, тогда как у меня только один,Любая помощь будет оценена.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Попробуй это.Сгруппируйте все столбцы, в которых вы ожидали, что информация будет дублироваться, а затем объедините различные значения «dest_port» в список:

df = pd.DataFrame([
            ["Firewall-1","outside","tcp","4.4.4.4",53,"1.1.1.1",1025,"outbound","allowed","",2], 
            ["Firewall-1","outside","tcp","4.4.4.4",53,"1.1.1.1",1026,"outbound","allowed","",2], 
            ["Firewall-1","outside","tcp","4.4.4.4",22,"1.1.1.1",1028,"outbound","allowed","",2], 
            ["Firewall-1","outside","tcp","3.3.3.3",22,"2.2.2.2",2200,"outbound", "allowed","",2]
        ], 
        columns=["dvc","src_interface","transport","src_ip","src_port","dest_ip","dest_port","direction", "action", "cause", "count"])

index_cols = df.columns.tolist()
index_cols.remove("dest_port") 
df = df.groupby(index_cols)["dest_port"].apply(list)
df = df.reset_index()

это приведет к 3 оставшимся строкам, а не к 2, как в желаемом выводе:

   dvc              src_interface transport   src_ip         src_port  dest_ip direction   action cause  count     dest_port
0  Firewall-1       outside       tcp         3.3.3.3        22  2.2.2.2  outbound  allowed            2        [2200]
1  Firewall-1       outside       tcp         4.4.4.4        22  1.1.1.1  outbound  allowed            2        [1028]
2  Firewall-1       outside       tcp         4.4.4.4        53  1.1.1.1  outbound  allowed            2  [1025, 1026]
0 голосов
/ 25 ноября 2018

Я думаю, что следующее может сделать то, что вы ищете:

    import pandas as pd
    #create practice dataframe. will remove rows if values in 'key' are duplicate
    df = pd.DataFrame({'key':[1,1,3,4],'color':[1,2,3,2],'house':[1,2,3,7]})
    print(df.drop_duplicates(['key']))

Исходный фрейм данных:

    key  color  house
    1      1      1
    1      2      2
    3      3      3
    4      2      7

Выходной фрейм данных:

    key  color  house
    1      1      1
    3      3      3
    4      2      7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...