按最常用的值汇总数据框列

时间:2020-09-17 14:40:12

标签: pandas dataframe group-by sum frequency

我有一个如下数据框:

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

我将不胜感激。谢谢。

1 个答案:

答案 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()
)