繁体   English   中英

按列 a 删除 Dataframe 中的重复行,同时保留包含列 b 中列表值的行

[英]Dropping duplicate rows in a Dataframe by column a, while keeping rows that contain values from list in column b

     address    issue
row_1   1   No Issue
row_2   1   Value
row_3   1   None
row_4   2   None
row_5   2   Test
row_6   2   None
row_7   3   Example
row_8   4   None
row_9   5   None
row_10  5   None
row_11  5   None
row_12  5   None
row_13  6   No Issue
row_14  6   Example
row_15  6   None

鉴于上述数据框,我想删除“地址”列上的重复项。 但是,对于每个重复的组,我想保留下面列表中具有问题列值的行,并删除其余的行。

issue_list = ['Value', 'Test', 'Example', 'Sample', 'Signal']

如果重复组在上述列表中没有任何问题值(例如 address == 5 如何具有所有“无”问题值),则可以删除重复项而不必担心保留哪个,但我确实想保留最后一个。

因此所需的输出数据帧如下所示:

     address    issue
row_2   1   Value
row_5   2   Test
row_7   3   Example
row_8   4   None
row_12  5   None
row_14  6   Example

到目前为止,我已经尝试了很多东西,但我认为我很困难。 在删除重复项之前对问题列进行排序似乎是一个不错的选择,但我的问题是数据没有得到很好的维护,并且“无”问题可能是任何响应(无问题,否,拼写错误)使按字母顺序排列系统不可靠。 展望未来,更多问题将添加到 issue_list,因此我正在尝试利用值列表。 我也想过将问题编码为数字,然后以这种方式排序,但在采取这一步之前,我想我会在这里问,因为我觉得应该有一个解决方案。 我试过了:

df.loc[(df['issue'].isin(issue_list)) | ~df['address'].duplicated(keep=False)]

哪个返回:

    address issue
row_2   1   Value
row_5   2   Test
row_7   3   Example
row_8   4   None
row_14  6   Example

这很接近,但它跳过了地址 5(具有所有“无”问题值的地址)。 对不起,如果这是一个重复的问题,我发现了很多关于 drop_duplicates 函数的问题,但我的情况似乎更独特。

感谢您的时间和帮助。

我们可以把它分成几个步骤:

第 1 步:为issue_list行创建一个布尔值

df["issue_isin_list"] = df.issue.isin(issue_list)

第 2 步:为每一行创建一个分组并获取新创建的布尔列的总和:

df["issue_temp"] = df.groupby("address").issue_isin_list.transform(sum)

第 3 步:创建一个过滤器,其中df.issue_isin_list == 1df.issue_temp == 0

filter_condition = (df.issue_isin_list == 1) | (df.issue_temp == 0)

第 4 步:现在使用上述条件进行过滤,并删除addressissue列上的重复项:

df.loc[filter_condition, ["address", "issue"]].drop_duplicates(["address", "issue"])

        address issue
row_2   1   Value
row_5   2   Test
row_7   3   Example
row_8   4   None
row_9   5   None
row_14  6   Example

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM