Конкатенация условий - PullRequest
0 голосов
/ 01 июня 2018

Этот вопрос может быть немного сложным ...

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

{"ip_src": "192.168.84.129", "ip_dst": "192.168.84.128", "label": 1}

, когда столбец «ip_src» информационного кадра имеет значение «192.168.84.129», а столбец «ip_dst» имеет значение «192.168.84.128», эти строки должны быть помеченыс 1.Дело в том, что эти условия могут различаться, поэтому я хочу обобщить код, чтобы я мог передать несколько других условий:

{"ip_src": "192.168.1.101", "dst_port": 19305, "label": 4}

и т. Д.

Я начал с:

def labeling(df, crit):
    for dic in crit:
        lbl = dic["label"]
        del dic["label"]
        conds = []
        pairs = len(dic)
        for key in dic:
            conds.append((df[key] == dic[key])) 

Но я застреваю в последней строке, потому что не могу понять, как объединить условия и затем применить их как: df[conds] = lbl

Спасибо!

Редактировать:

Ввод:

   index         ip_src         ip_dst  ip_proto  frame_time_delta  \
0      0  192.168.84.129 192.168.84.128      17.0          0.000000   
1      1    31.13.94.53  192.168.1.101      17.0          0.006656   
2      2  192.168.1.101    31.13.94.53      17.0          0.012948   

   payload_size  src_port  dst_port  flow_dir  
0         172.0   52165.0   40002.0         1  
1         176.0   40002.0   52165.0         0  
2         172.0   52165.0   19305.0         1 

Выход:

       ip_src         ip_dst       ip_proto  frame_time_delta  \
0  192.168.84.129 192.168.84.128     17.0          0.000000   
1    31.13.94.53  192.168.1.101      17.0          0.006656   
2  192.168.1.101    31.13.94.53      17.0          0.012948   

   payload_size  src_port  dst_port  flow_dir   label
0         172.0   52165.0   35456.0         1    1 
1         176.0   40002.0   52165.0         0    0
2         172.0   52165.0   19305.0         1    4

Возможнослучаи:

l_crit = [{"ip_src": "192.168.84.129", "ip_dst": "192.168.84.128", "label": 1},
          {"ip_src": "192.168.1.100", "ip_dst": "192.168.1.105", "dst_port": 9999, "label": 1},
          {"ip_src": "192.168.1.101", "ip_dst": "104.44.195.76", "label": 2},
          {"ip_src": "192.168.1.101", "ip_dst": "31.13.94.53", "ip_proto": 17, "label": 3},
          {"ip_src": "192.168.1.101", "dst_port": 19305, "label": 4}]

1 Ответ

0 голосов
/ 01 июня 2018

попробуйте,

crit=[{"ip_src": "192.168.84.129", "ip_dst": "192.168.84.128", "label": 1},{"ip_src": "192.168.1.101", "dst_port": 19305, "label": 4}]

dictionary={}
for dic in crit:
    dictionary[dic['ip_src']]=dic['label']
df['label']=df['ip_src'].map(dictionary).fillna(0)

Ввод:

           ip_src          ip_dst  ip_proto  frame_time_delta  payload_size  \
0  192.168.84.129  192.168.84.128      17.0          0.000000         172.0   
1     31.13.94.53   192.168.1.101      17.0          0.006656         176.0   
2   192.168.1.101     31.13.94.53      17.0          0.012948          72.0   

   src_port  dst_port  flow_dir  
0   52165.0   35456.0         1  
1   40002.0   52165.0         0  
2   52165.0   19305.0         1

Выход:

           ip_src          ip_dst  ip_proto  frame_time_delta  payload_size  \
0  192.168.84.129  192.168.84.128      17.0          0.000000         172.0   
1     31.13.94.53   192.168.1.101      17.0          0.006656         176.0   
2   192.168.1.101     31.13.94.53      17.0          0.012948          72.0   

   src_port  dst_port  flow_dir  label  
0   52165.0   35456.0         1    1.0  
1   40002.0   52165.0         0    0.0  
2   52165.0   19305.0         1    4.0 

Редактировать 1:

l_crit = [{"ip_src": "192.168.84.129", "ip_dst": "192.168.84.128", "label": 1},
          {"ip_src": "192.168.1.100", "ip_dst": "192.168.1.105", "dst_port": 9999, "label": 1},
          {"ip_src": "192.168.1.101", "ip_dst": "104.44.195.76", "label": 2},
          {"ip_src": "192.168.1.101", "ip_dst": "31.13.94.53", "ip_proto": 17, "label": 3},
          {"ip_src": "192.168.1.101", "dst_port": 19305, "label": 4}]


temp=pd.DataFrame()

l=[]
v=[]
for dic in l_crit:
    l.append(dic['ip_src'])
    v.append(dic['label'])
temp['ip_src']=l
temp['label']=v

df=pd.merge(df,temp,how='left',on=['ip_src'])
df['label']=df['label'].fillna(0)

Ввод:

          ip_src          ip_dst  ip_proto  frame_time_delta  payload_size  \
0  192.168.84.129  192.168.84.128      17.0          0.000000         172.0   
1     31.13.94.53   192.168.1.101      17.0          0.006656         176.0   
2   192.168.1.101     31.13.94.53      17.0          0.012948          72.0   

   src_port  dst_port  flow_dir  
0   52165.0   35456.0         1  
1   40002.0   52165.0         0  
2   52165.0   19305.0         1

Вывод:

           ip_src          ip_dst  ip_proto  frame_time_delta  payload_size  \
0  192.168.84.129  192.168.84.128      17.0          0.000000         172.0   
1     31.13.94.53   192.168.1.101      17.0          0.006656         176.0   
2   192.168.1.101     31.13.94.53      17.0          0.012948          72.0   
3   192.168.1.101     31.13.94.53      17.0          0.012948          72.0   
4   192.168.1.101     31.13.94.53      17.0          0.012948          72.0   

   src_port  dst_port  flow_dir  label  
0   52165.0   35456.0         1    1.0  
1   40002.0   52165.0         0    0.0  
2   52165.0   19305.0         1    2.0  
3   52165.0   19305.0         1    3.0  
4   52165.0   19305.0         1    4.0 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...