我正在尝试将多组行组合在一起,以使用python和pandas删除CSV中的重复项。基于公共值,'ID',如果存在重复行,则另一列'HostAffected'中的值应与换行符组合。与此帖子类似:enter link description here但是我需要保留所有等同于相同ID的exisitng值。我已经使用下面的代码作为示例对列进行了类似的操作,但它并不完全相同:
df = pd.read_csv("output.csv")
cols = ['Host','Protocol','Port']
newcol = ['/'.join(i) for i in zip(df['Host'],df['Protocol'],df['Port'].map(str))]
df = df.assign(HostAffected=newcol).drop(cols, 1)
到目前为止我有这个代码:
df.groupby(['Plugin ID','Description])[HostAffected'].apply(list)
改编自这个帖子:enter link description here但是这不起作用。
我会看到一组示例数据:
PluginID Description HostAffected
10395 Windows SMB Shares Enumeration 10.0.0.10/tcp/445
10396 Windows SMB Shares Access 10.0.0.10/tcp/445
10396 Windows SMB Shares Access 192.168.0.12/tcp/445
10398 Windows SMB LsaQueryInformationPolicy 10.0.0.10/tcp/445
10399 SMB Use Domain SID to Enumerate Users 10.0.0.10/tcp/445
10400 Windows SMB Registry Remotely Accessible 10.0.0.10/tcp/445
10736 DCE Services Enumeration 10.0.0.10/tcp/139
10736 DCE Services Enumeration 10.0.0.10/tcp/445
10736 DCE Services Enumeration 192.168.0.12/tcp/445
值以逗号分隔,但我使用空格使其更清晰。我希望它看起来像这样,“插件ID”和“描述”只有一个唯一的行,并且“HostAffected”列被合并:
ID Description HostAffected
10395 Windows SMB Shares Enumeration 10.0.0.10/tcp/445
10396 Windows SMB Shares Access 10.0.0.10/tcp/445
192.168.0.12/tcp/445
10398 Windows SMB LsaQueryInformationPolicy 10.0.0.10/tcp/445
10399 SMB Use Domain SID to Enumerate Users 10.0.0.10/tcp/445
10400 Windows SMB Registry Remotely Accessible 10.0.0.10/tcp/445
10736 DCE Services Enumeration 10.0.0.10/tcp/139
10.0.0.10/tcp/445
192.168.0.12/tcp/445
对于多组HostsAffected,基本上可能存在相同的ID和描述。任何帮助都将非常感激,因为这比将列组合在一起稍微复杂和具有挑战性。
答案 0 :(得分:0)
评论结束后,如果apply
和join
跟line break
进行搜索,则我们会得到strip
:
df['Description'] = df['Description'].str.strip()
(df.groupby(['Plugin ID','Issue'])['HostAffected']
.apply('\n'.join)
.reset_index())