python-3.x - 如何根据另一列中的间隔填充基于 Pandas 中其他列的缺失值?
问题描述
假设我有这个df_atm
:
borough Longitude Latitude
0 bronx 40.79 -73.78
1 manhattan 40.78 -73.90
2 staten island 40.84 -73.95
3 NaN 40.57 -74.11
每行代表一次 ATM 取款。
我希望根据经度和纬度列内的坐标生成缺失值的值。
borough Longitude Latitude
0 bronx 40.79 -73.78
1 manhattan 40.78 -73.90
2 staten island 40.84 -73.95
3 staten island 40.57 -74.11
由于坐标 [40.57, -74.11] 位于史泰登岛的自治市镇内。
我已经生成了一个带有行政区坐标的字典:
borough_dict = {"Bronx" : [40.837048, -73.865433], "Brooklyn" : [40.650002, -73.949997], "Manhattan" : [40.758896, -73.985130], "Queens" : [40.742054,-73.769417], "Staten Island" : [40.579021,-74.151535]}
这就是我到目前为止所尝试的(代码/伪代码):
df_atm['borough'] = df_atm.apply(
lambda row: **idk what do to here** if np.isnan(row['borough']) else row['borough'],
axis=1
)
提前谢谢了!
解决方案
尝试这个 :
from math import cos, asin, sqrt
import pandas as pd
def distance(lat1, lon1, lat2, lon2):
p = 0.017453292519943295
a = 0.5 - cos((lat2-lat1)*p)/2 + cos(lat1*p)*cos(lat2*p) * (1-cos((lon2-lon1)*p)) / 2
return 12742 * asin(sqrt(a))
def closest(data, v):
return min(data, key=lambda p: distance(v[0], v[1], p[0], p[1]))
df = pd.DataFrame(
[
{'borough': 'bronx', 'lat': 40.79, 'long': -73.78},
{'borough': 'manhattan', 'lat': 40.78, 'long': -73.90},
{'borough': None, 'lat': 40.57, 'long': -74.11}
],
)
borough_dict = {"Bronx" : [40.837048, -73.865433], "Brooklyn" : [40.650002, -73.949997], "Manhattan" : [40.758896, -73.985130], "Queens" : [40.742054,-73.769417], "Staten Island" : [40.579021,-74.151535]}
boroughs = [(*value, key) for key, value in borough_dict.items()]
df['borough'] = df.apply(
lambda row: closest(boroughs, [row['lat'], row['long']])[2] if row['borough'] is None else row['borough'],
axis=1
)
print(df)
输出:
borough lat long
0 bronx 40.79 -73.78
1 manhattan 40.78 -73.90
2 Staten Island 40.57 -74.11
感谢@trincot的回答
推荐阅读
- powershell - 无法执行以“WITH”而不是“SELECT”开头的 SQL 查询
- ios - 展开的可选和非可选值产生“线程 1:致命错误:在隐式展开可选值时意外发现 nil”
- java - GameStateManager 和屏幕
- c++ - 函数中的向量返回意外结果,循环
- c# - 如何从游戏对象列表中删除游戏对象,其中每个游戏对象都是实例化的“块”或类
- android - 如何使用 GridLayout 创建对话框?
- javascript - 如何确定两个 HTML 事件具有相同的来源(然后确定“事件已处理”)
- javascript - 向上滚动添加标题后滚动平滑过渡
- ios - 下载用于在本地通知上显示的图像不起作用
- python - 管道参数无效