首页 > 解决方案 > 具有重叠坐标的 Pandas double(?) groupby

问题描述

我需要帮助来解决以下问题。我可以在循环中做到这一点,但如果有人可以用 pythonic 方式解决它会很有趣。

假设我们有一个包含生产部件的数据框,每个都可能有很多缺陷。缺陷是有类型的,尽管并非所有缺陷都存在于每个部分。每个缺陷都有一个严重性(1 到 5,5 是最差的)和缺陷开始和结束的坐标。缺陷是独立的,可以任意重叠。

如何生成一个数据框,其中包含每个部分中该部分缺陷严重程度最差的部分?

例如:

如果有 3 个缺陷 A,坐标为 10,100,严重性为 3;B,坐标 40、50,严重性 5(B 完全在 A 中);C,坐标 80,120,严重性 4(C 与 A 重叠);那么我们应该得到一个数据框:

part_id severity start end
1        3        10   40
1        5        40   50
1        3        50   80
1        4        80   120

对于更大的df:

import pandas as pd
df = pd.DataFrame(columns=['part_id', 'defect_type', 'severity', 'start', 'end'],
             data=[[1,12, 4,1,  10],
                   [1,14, 3,5,  100],
                   [1,10, 1,50, 110],
                   [1,102,3,1,  10],
                   [1,10, 2,200,500],
                   [1,10, 5,300,400],
                   [1,102,1,100,1000],
                   [2,11, 4,2, 10],
                   [2,14, 5,5, 100],
                   [2,102,1,50,110],
                   [2,12, 3,1,10],
                   [2,11, 2,200, 500],
                   [2,14, 4,350, 400],
                   [2,102,1,300, 2000]])

part_no=1 的结果是:

df_result = pd.DataFrame(columns=['part_id', 'defect_type', 'severity', 'start', 'end'],
             data=[[1, 4,  1,  10],
                   [1, 3, 10, 100], 
                   [1, 1,100, 110], # can be combined with next row
                   [1, 1,110, 200],
                   [1, 2,200, 300],
                   [1, 5,300, 400],
                   [1, 2,400, 500],
                   [1, 1,500,1000],
                   ])

标签: pandaspandas-groupby

解决方案


推荐阅读