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