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函数周围发现了很多问题,但我的情况似乎更加独特。
感谢您的时间和帮助。
答案 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 == 1
或df.issue_temp == 0
处创建一个过滤器:
filter_condition = (df.issue_isin_list == 1) | (df.issue_temp == 0)
步骤4:现在使用上述条件进行过滤,并将重复项放在address
和issue
列上:
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