如何按时间间隔合并两个数据帧?

问题描述 投票:0回答:1

我有两个数据框,mp 和 sp。

mp 包含州路线 (int)、~1/10 里程标 (float) 标记、纬度 (float)、经度 (float)。

enter image description here

sp 有状态路线 (int)、〜限速开始和结束的里程碑 (float),以及限速 (int)。

enter image description here

我想要一个数据帧(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])
python pandas conditional-statements apply
1个回答
0
投票

我有一个重新开始的第一个解决方案,但有一些弱点:

  • 不是 100% Pythonic,因为它仍然基于
    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
    
© www.soinside.com 2019 - 2024. All rights reserved.