我通过合并原始DF和原始版本的重新采样版本创建了DF。重新采样的版本为Bin_time
和ave_knots
,它们在联合字段ID
上合并以创建此DF。
id trip_id knots times Bin_time ave_knots
0 5045493 10789 6.4924256 5/6/15 17:48 5/6/15 17:30 3.376727771
1 5045494 10789 12.537768 5/6/15 17:53 5/6/15 18:00 2.592866578
2 5045495 10789 9.136048 5/6/15 18:03 5/6/15 18:30 1.109755927
3 5045496 10789 6.4341104 5/6/15 18:04 5/6/15 19:00 1.447413169
4 5045497 10789 10.7688736 5/6/15 18:04 5/6/15 19:30 1.900643556
5 5045498 10789 10.41250293 5/6/15 18:09
6 5045499 10789 11.22891573 5/6/15 18:41
7 5045500 10789 12.04532853 5/6/15 18:46
8 5045501 10789 12.86174133 5/6/15 19:08
我尝试做的是times
中的时间戳适合重新采样的Bin_time
,将Bin_time
和ave_knots
附加到结尾处df['test'] = np.where(df.times > (df.Bin_time - dt.timedelta(minutes=30)) & (df.times < df.Bin_time ))
行。这是一个成对的数据示例,最终它将需要工作在3-5百万行。
我尝试了一些不同的方法,例如 id trip_id knots times Bin_time ave_knots
0 5045493 10789 6.4924256 5/6/15 17:48 5/6/15 17:30 3.376727771
1 5045494 10789 12.537768 5/6/15 17:53 5/6/15 17:30 3.376727771
2 5045495 10789 9.136048 5/6/15 18:03 5/6/15 18:00 2.592866578
3 5045496 10789 6.4341104 5/6/15 18:04 5/6/15 18:00 2.592866578
4 5045497 10789 10.7688736 5/6/15 18:04 5/6/15 18:00 2.592866578
5 5045498 10789 10.41250293 5/6/15 18:09 5/6/15 18:00 2.592866578
6 5045499 10789 11.22891573 5/6/15 18:41 5/6/15 18:30 1.109755927
7 5045500 10789 12.04532853 5/6/15 18:46 5/6/15 18:30 1.109755927
8 5045501 10789 12.86174133 5/6/15 19:08 5/6/15 19:00 1.447413169
并将单个值辅助列合并为suggested here。该解决方案的问题在于,通过将重采样DF与原始DF的每个条目合并,创建了一个巨大的DF。在尝试在较大的DF上运行脚本时,这会导致我的计算机崩溃。如果我将DF读成CSV并且this solution速度慢且效率低,那么我可以使用它,所以我试图保留在Pandas中,因为我认为它应该提供更快的速度溶液
期望的结果
GetDefaultFolder
答案 0 :(得分:2)
我首先要将重采样输出与原始DataFrame分开。我已经将您的示例复制到以下代码中,希望能够模仿您的实际数据(请注意,日期列应该被解释为实际的日期时间对象,或者这不会起作用)。
import pandas as pd
from StringIO import StringIO
df = pd.read_table(StringIO("""
id trip_id knots times
5045493 10789 6.4924256 5/6/15-17:48
5045494 10789 12.537768 5/6/15-17:53
5045495 10789 9.136048 5/6/15-18:03
5045496 10789 6.4341104 5/6/15-18:04
5045497 10789 10.7688736 5/6/15-18:04
5045498 10789 10.41250293 5/6/15-18:09
5045499 10789 11.22891573 5/6/15-18:41
5045500 10789 12.04532853 5/6/15-18:46
5045501 10789 12.86174133 5/6/15-19:08"""), sep='\s+', parse_dates=[3])
df2 = pd.read_table(StringIO("""
Bin_time ave_knots
5/6/15-17:30 3.376727771
5/6/15-18:00 2.592866578
5/6/15-18:30 1.109755927
5/6/15-19:00 1.447413169
5/6/15-19:30 1.900643556"""), sep='\s+', parse_dates=[0])
df2 = df2.set_index('Bin_time', drop=False)
df2 = df2.reindex(df['times'], method='ffill').reset_index(drop=True)
df = pd.concat([df, df2[['Bin_time', 'ave_knots']]], axis=1)
这可以通过将df2
上的索引设置为Bin_time
列,以便reindex
使用&#34;转发填充&#34;将自动将垃圾箱放在正确的位置。您可以阅读有关填写缺失数据的说明here。
然后,您必须使用reset_index
来取回df
中存在的简单整数索引,以便pd.concat
将它们放在正确的位置。
我不知道这是否是最节省内存的,但它应该干净利落。
输出df
如下所示:
id trip_id knots times Bin_time ave_knots
0 5045493 10789 6.492426 2015-05-06 17:48:00 2015-05-06 17:30:00 3.376728
1 5045494 10789 12.537768 2015-05-06 17:53:00 2015-05-06 17:30:00 3.376728
2 5045495 10789 9.136048 2015-05-06 18:03:00 2015-05-06 18:00:00 2.592867
3 5045496 10789 6.434110 2015-05-06 18:04:00 2015-05-06 18:00:00 2.592867
4 5045497 10789 10.768874 2015-05-06 18:04:00 2015-05-06 18:00:00 2.592867
5 5045498 10789 10.412503 2015-05-06 18:09:00 2015-05-06 18:00:00 2.592867
6 5045499 10789 11.228916 2015-05-06 18:41:00 2015-05-06 18:30:00 1.109756
7 5045500 10789 12.045329 2015-05-06 18:46:00 2015-05-06 18:30:00 1.109756
8 5045501 10789 12.861741 2015-05-06 19:08:00 2015-05-06 19:00:00 1.447413