【发布时间】:2020-12-18 13:15:09
【问题描述】:
我正在检查NYC MVA 数据集。在 1,697,572 条记录中,我确定大约有 518,000 条缺少邮政编码数据:
最小数据样本
CRASH DATE CRASH TIME BOROUGH ZIP CODE LATITUDE LONGITUDE LOCATION
0 07/13/2019 4:10 NaN NaN 40.69114 -73.80488 POINT (-73.80488 40.69114)
1 06/27/2019 21:30 NaN NaN 40.58353 -73.98418 POINT (-73.984184 40.583534)
2 07/05/2019 19:40 NaN NaN 40.61017 -73.92289 POINT (-73.92289 40.610165)
3 06/30/2019 2:30 NaN NaN 40.70916 -73.84107 POINT (-73.84107 40.709156)
4 07/18/2019 17:50 NaN NaN 40.74617 -73.82473 POINT (-73.82473 40.746174)
np.sort(df['ZIP CODE'].astype('str').unique())[:10]
[Out]: array([' ', '10000', '10000.0', '10001', '10001.0', '10002',
'10002.0', '10003', '10003.0', '10004'], dtype=object)
empty = np.sort(df['ZIP CODE'].astype('str').unique())[0]
empty_cells = df['ZIP CODE'].isin([empty, np.nan])
len(empty_cells[empty_cells==True])
[Out]: 518797
考虑到数据集的大小,我知道我可能可以通过基于 LONGITUDE 和 LATITUDE 特征的 ZIP 数据的最近 MVA 的欧几里德距离来纠正很多问题。
对于初学者,我尝试创建一个新列,它可以使用以下方法简单地找到两个纵向点之间的最小距离:
apply(lambda x: df.loc[min(abs(df['LONGITUDE'] - df.loc[x, 'LONGITUDE'])),:])
但是有了这个代码,我电脑的粉丝差点把我送上飞机。我在我的电脑出现问题之前将其关闭。
我知道有一种方法可以创建一个允许我选择最小欧几里得距离的列,但我只是不确定如何编写初始选择代码。
【问题讨论】:
-
您可能应该使用某种最近邻算法来找到彼此之间最近的点。通过蛮力(正如您尝试做的那样)执行此操作不是很有效,并且肯定不会扩展到 1m+ 记录。见scikit-learn.org/stable/modules/…
-
由于已关闭,我无法添加答案,请参阅此要点和示例(可能不是最佳)解决方案:gist.github.com/gusutabopb/652757f6c3b429a6698081cdbef3518b
标签: python pandas lambda apply