gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:18:06 25 4
gpt4 key购买 nike

我有一个通过合并原始 DF 和原始 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到该行的末尾。这是一个配对数据示例,最终它将必须处理 3 - 5 百万行。

我尝试了几种不同的方法,例如df['test'] = np.where(df.times > (df.Bin_time - dt.timedelta(minutes=30)) & (df.times < df.Bin_time ))并合并到单个值辅助列上 suggested here 。该解决方案的问题在于,它通过将重新采样的 DF 与原始 DF 的每个条目合并,创建了一个巨大的 DF。当我尝试在较大的 DF 上运行脚本时,这导致我的计算机崩溃。如果我将 DF 读入 CSV,我就可以工作了,但是 this solution速度慢且效率低,所以我试图保留 Pandas,因为我相信它应该提供更快的解决方案。

期望的结果

    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

最佳答案

我首先将重新采样的输出与原始数据帧分开。我已将您的示例复制到以下代码中,希望能够模仿您的实际数据(请注意,日期列应解释为实际的日期时间对象,否则这将不起作用)。

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列来实现,这样使用“前向填充”的重新索引将自动放置垃圾箱在正确的地方。您可以阅读说明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

关于python - Pandas DF,不等列中的条件选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34072966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com