我有两个数据框,mp 和 sp。
mp 包含州路线 (int)、~1/10 里程标 (float) 标记、纬度 (float)、经度 (float)。
sp 有状态路线 (int)、〜限速开始和结束的里程碑 (float),以及限速 (int)。
我想要一个数据帧(sp + 速度限制),但无法加入州路线和里程碑。如何根据间隔将速度限制应用于 mp 中的每个里程碑?即,对于国道 2,里程标 0, 0.1,限速 = 30;里程碑 0.2、0.3、...、2.8,限速 = 55;等等
我尝试过 pandas merge,但丢失了很多行。尝试使用 fuzzypanda 进行模糊连接,但出现 fuzzypanda.matching 不存在的错误(它应该有的一种方法!),因此无法创建模糊列进行合并。 以下也没有解决:
for route in mp['route']:
for milepost in mp['milepost']:
if (route == sp['route']) & (milepost >= sp['begin']) & (milepost <= sp['end']):
mp.insert(1, 'limit', sp['limit'][0])
我有一个重新开始的第一个解决方案,但有一些弱点:
mp
DataFrame 提供的“参考”表,使用 for
循环逐行分析您的
sp
DataFrame。
sp
数据帧的每一对
("state route", "milepost")
,恰好有一个匹配的
mp
“条件”行。
mp
DataFrame 中添加了两行,使得
mp
和
sp
不具有相同的长度。
评论:如果能以文本形式而不是 PNG 图像提供示例数据就好了……
import pandas as pd
mp_data = {
"state route": [2, 2, 2, 2, 2, 2, 2],
"milepost": [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6],
"latitude": [
-122.18988,
-122.18807,
-122.18621,
-122.1842,
-122.1821,
-122.18,
-122.175,
],
"longitude": [47.97906, 47.97976, 47.97956, 47.9791, 47.97872, 47.978, 47.9775],
}
df_mp = pd.DataFrame(mp_data)
sp_data = {
"state route": [2, 2, 2, 2, 2],
"start speed limit milepost": [0, 0.13, 2.88, 12.08, 12.72],
"stop speed limit milepost": [0.13, 2.88, 12.08, 12.72, 14.22],
"speed limit": [30, 55, 60, 55, 45],
}
df_sp = pd.DataFrame(sp_data)
检查它是什么样子print(df_mp)
state route milepost latitude longitude
0 2 0.0 -122.18988 47.97906
1 2 0.1 -122.18807 47.97976
2 2 0.2 -122.18621 47.97956
3 2 0.3 -122.18420 47.97910
4 2 0.4 -122.18210 47.97872
5 2 0.5 -122.18000 47.97800
6 2 0.6 -122.17500 47.97750
print(df_sp)
state route start speed limit milepost stop speed limit milepost \
0 2 0.00 0.13
1 2 0.13 2.88
2 2 2.88 12.08
3 2 12.08 12.72
4 2 12.72 14.22
speed limit
0 30
1 55
2 60
3 55
4 45
向 df_mp
DataFrame 添加速度限制
list_sl = []
# comment: preparing a list that will be filled row by row
# is also an unsatisfactory method that could be improved
for _, row in df_mp.iterrows():
list_sl.append(
(
df_sp["speed limit"].loc[
(row["state route"] == df_sp["state route"])
& (row["milepost"] >= df_sp["start speed limit milepost"])
& (row["milepost"] < df_sp["stop speed limit milepost"])
]
).iloc[0] # works only because we assume that there is exacly one solution
)
df_mp["speed limit"] = list_sl
结果print(df_mp)
state route milepost latitude longitude speed limit
0 2 0.0 -122.18988 47.97906 30
1 2 0.1 -122.18807 47.97976 30
2 2 0.2 -122.18621 47.97956 55
3 2 0.3 -122.18420 47.97910 55
4 2 0.4 -122.18210 47.97872 55
5 2 0.5 -122.18000 47.97800 55
6 2 0.6 -122.17500 47.97750 55