合并行以删除CSV Python和Pandas中的重复项

时间:2018-05-13 19:09:09

标签: python pandas csv dataframe pandas-groupby

我正在尝试将多组行组合在一起,以使用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和描述。任何帮助都将非常感激,因为这比将列组合在一起稍微复杂和具有挑战性。

1 个答案:

答案 0 :(得分:0)

评论结束后,如果applyjoinline break进行搜索,则我们会得到strip

df['Description'] = df['Description'].str.strip()

(df.groupby(['Plugin ID','Issue'])['HostAffected']
   .apply('\n'.join)
   .reset_index())