地址范围的最小值、最大值和步长

Min, max and step for address ranges

我有一个 Pandas 数据框,其中包含 16,000 个按街道和城市分组的地址。我需要找到连续地址范围之间的最小值、最大值和步长。

例如,10,12,14,16 Main street。最小值为 10,最大值为 16,步长为 2。

问题是范围并不总是那么简单,有些不是真正的地址范围,而是分布在街道上的地址。

例如,主街 4456、5567、6678。

我希望能够识别顺序范围及其最小值、最大值和步长,并将不连续的范围分隔成单独的行。

到目前为止,我已经弄清楚了最小值和最大值,但我不知道如何找到连续地址。

    df['street_min']=[min(x) for x in df['Street Number'].tolist()]
    df['street_max']=[max(x) for x in df['Street Number'].tolist()]

示例数据

    ID    Street_number     Street_Name
    1     [10,12,14,16]     Main St
    2     [4456, 5567, 6657] First St        (These 3 would become 3 unique records)
    3     [60,65,70, 100]   Second St         (This example would keep 60-70 and remove 100 to another row)

让我们分解 Street_number,找到连续的差异并与 ID 一起分组:

df = df.explode('Street_number')

# consecutive differences
df['diff'] = df.groupby('ID')['Street_number'].diff().bfill()

# groups
df['group'] = df.groupby('ID')['diff'].transform(lambda x: x.ne(x.shift()).cumsum())

# output:
(df.groupby(['group','ID'], as_index=False)
   .agg(Street_number=('Street_number',list),
        Street_Name=('Street_Name', 'first'),
        min_number=('Street_number','min'),
        max_number=('Street_number', 'max')
       )
)

输出:

   group  ID     Street_number Street_Name  min_number  max_number
0    1.0   1  [10, 12, 14, 16]     Main St          10          16
1    1.0   2      [4456, 5567]    First St        4456        5567
2    1.0   3      [60, 65, 70]   Second St          60          70
3    2.0   2            [6657]    First St        6657        6657
4    2.0   3             [100]   Second St         100         100