我有一个如下数据框:
source_ip destination_ip malware_tag ransomware_tag brutefore_tag source_bytes destination_bytes label
ip_1 ip_2 True True False 10 20 0
ip_1 ip_2 True False False 20 60 0
ip_1 ip_2 True False False 30 100 0
ip_1 ip_2 True True False 40 300 0
ip_3 ip_4 False False True 5 20 1
ip_3 ip_4 False False True 500 9 1
ip_3 ip_4 False True True 200 15 1
我首先要为每个“标签”创建一个称为“攻击类型”的新列,该列是基于三个布尔标签列创建的;仅考虑最常见/最频繁的攻击标志。因此,我希望结果数据帧看起来如下所示:
source_ip destination_ip source_bytes destination_bytes label attack_type
ip_1 ip_2 10 20 0 malware
ip_1 ip_2 20 60 0 malware
ip_1 ip_2 30 100 0 malware
ip_1 ip_2 40 300 0 malware
ip_3 ip_4 5 20 1 bruteforre
ip_3 ip_4 500 9 1 bruteforce
ip_3 ip_4 200 15 1 bruteforce
第二个摘要(源字节和目标字节的总和)按源IP和目标IP生成的数据帧。因此,最终数据帧应如下所示:
source_ip destination_ip total_source_bytes total_destination_bytes attack_type
ip_1 ip_2 100 480 malware
ip_3 ip_4 705 44 bruteforce
我将不胜感激。谢谢。
答案 0 :(得分:3)
让我们尝试idxmax
为每个标签提取攻击类型,然后map
将标签转换为最常见的攻击类型:
atk_by_labels = df.filter(like='tag').groupby(df['label']).sum().idxmax(1)
# first summary
df['attack_type'] = df['label'].map(atk_by_labels)
# second summary
(df.groupby(['source_ip', 'destination_ip', 'attack_type'], as_index=False)
[['total_source_bytes','total_destination_bytes']].sum()
)