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

时间:2020-10-12 23:18:23

标签: python-3.x pandas dataframe

     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如何具有所有“ None”发行值),则可以删除重复项而不必担心保留哪个,但是我这样做想要保留至少一个。

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

     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 个答案:

答案 0 :(得分:0)

我们可以将其分成几个步骤:

第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