Pandas DF,不等列中的条件选择

时间:2015-12-03 17:55:51

标签: python pandas

我通过合并原始DF和原始版本的重新采样版本创建了DF。重新采样的版本为Bin_timeave_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_timeave_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

1 个答案:

答案 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