地址范围的最小值、最大值和步长
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
我有一个 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