python - 地址范围的最小值、最大值和步长
问题描述
我有一个 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)
解决方案
让我们分解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
推荐阅读
- ruby - Ruby 类输出
- java - 我想将多个 JSON 对象组合成一个数组
- php - 打印没有数字索引的数组
- c++ - 隐式转换和函数运算符
- sql - 如何将 Foxpro 的语法转换为 SQL Server
- lucene - 转义特殊字符和编码不安全和保留字符 Lucene 查询语法 Azure 搜索
- regex - awk 正则表达式:帮助匹配在双引号内包含逗号字段的 CSV 文件
- android - 如何在不同的进程中使用 AsyncTask?
- yarnpkg - 纱线获取 package.json 位置以在脚本中使用它
- javascript - 如何在我现有的 div 中打印对象的键值数组并根据我的数据为每个单独的 div 使用带有循环的 JavaScript 重复它