首页 > 解决方案 > 地址范围的最小值、最大值和步长

问题描述

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

例如,10、12、14、16 大街。最小值为 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)

标签: pythonpandasrangesequencestreet-address

解决方案


让我们分解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

推荐阅读