熊猫-如果匹配条件和其他列中定义的时间范围,则将值分配给行

时间:2020-01-07 16:07:11

标签: python pandas

我有一个看似简单的问题,但我无法在此平台上找到答案。我在不同的日子使用多种设备进行了GPS跟踪实验。

我现在有两个数据框。第一个数据帧包含具有gpsnumber,时间戳,经度和纬度的gps点。第二个数据框包含有关实验的信息,我们在分发时和在gpstrackers中写下了自己。有实验编号,使用的gps编号,hand_out_time和hand_in_time列。

我有两个目标: (1)我想将gps数据与正确的实验匹配, (2)我要删除不在实验时间内的所有行。

这看起来像:

df:
    GPS_number  date_time           lon         lat     
744 16          2019-12-12 10:58:41 4.913158    52.367210   
745 16          2019-12-12 11:10:05 4.913158    52.367210   
746 16          2019-12-12 11:10:56 4.913085    52.367130   
747 16          2019-12-12 11:29:31 4.913085    52.367130   
748 16          2019-12-12 11:29:36 4.913191    52.367092   
df2:
    Measurement GPS_number  Visitor_type    Hand_out_time       Hand_in_time
0   1           3           Tourist         2019-12-12 11:35:00 2019-12-12 12:16:00
1   2           3           Tourist         2019-12-12 12:47:00 2019-12-12 14:34:00
2   3           5           Member          2019-12-12 11:10:00 2019-12-12 13:36:00
3   4           6           Member          2019-12-12 11:27:00 2019-12-12 12:55:00
4   5           6           Tourist         2019-12-12 12:54:00 2019-12-12 15:22:00

我尝试使用蒙版,但是这不起作用,因为我猜它不能正确匹配分发时间和分发时间。

mask = (df['GPS_number'] = (df2['GPS_number'] & (df['date_time'] > df2['Hand_out_time'] & (df['date_time'] < df2['Hand_in_time)
df = df[mask] 

如果有人可以告诉我该怎么做,那会很棒。谢谢。

1 个答案:

答案 0 :(得分:0)

遵循这些思路可能行得通,更多的想法是希望为df提供功能全面的代码。

[TestFixture]
public class AvatarController_Should
{
    [Test]
    public async Task IndexReturnsDefaultImage()
    {
        var hostingEnvironmentMock = new Mock<IWebHostEnvironment>();
        var dabataseName = nameof(IndexReturnsDefaultImage);
        var options = AvatarTestUtil.GetOptions(dabataseName);
        var userManagerWrapperMock = new Mock<IUserManagerWrapper>();

        using (var actAndAssertContext = new ApplicationDbContext(options))
        {
            var sut = new AvatarController(userManagerWrapperMock.Object, hostingEnvironmentMock.Object, actAndAssertContext);
        }
     }
}
   public class AvatarTestUtil
   {
    public static DbContextOptions<ApplicationDbContext> GetOptions(string databaseName)
    {
        var serviceCollection = new ServiceCollection()
            .AddEntityFrameworkInMemoryDatabase()
            .BuildServiceProvider();

        return new DbContextOptionsBuilder<ApplicationDbContext>()
            .UseInMemoryDatabase(databaseName)
            .UseInternalServiceProvider(serviceCollection)
            .Options;
    }
}

}

我不认为遮罩会像您最初那样在多个df中起作用。在我看来,您想要做的事情看起来像是SQL的Python左连接,带有多个on条件。这里的想法是与一个简单的匹配项合并,这将使具有多个重复项的数据集变得非常笨拙。将蒙版应用到该重新定义的df上将类似于添加额外的条件,并有望为您提供所需的内容。

另一个潜在的错误可能是,如果列之间的dtypes不一致。

如果以上操作均无效,请用错误消息或不正确的结果进行注释,然后尝试进行相应的编辑。