首页 文章

按数据帧分组的值只有不到一秒的时间 - 熊猫

提问于
浏览
2

假设我有一个pandas数据帧,如下所示:

>>> df=pd.DataFrame({'dt':pd.to_datetime(['2018-12-10 16:35:34.246','2018-12-10 16:36:34.243','2018-12-10 16:38:34.216','2018-12-10 16:42:34.123']),'value':[1,2,3,4]})
>>> df
                       dt  value
0 2018-12-10 16:35:34.246      1
1 2018-12-10 16:36:34.243      2
2 2018-12-10 16:38:34.216      3
3 2018-12-10 16:42:34.123      4
>>>

我想通过 'dt' 列对这个数据帧进行分组,但我想以一种它认为小于一秒不同的值相同的方式对它进行分组,在对这些数据进行分组后我想总结一下 'value' 列 . 每个组,我希望数据帧两个保持相同的长度,所以不到一秒的差值将是所有重复值,我到目前为止尝试:

>>> df.groupby('dt',as_index=False)['value'].sum()
                       dt  value
0 2018-12-10 16:35:34.246      1
1 2018-12-10 16:36:34.243      2
2 2018-12-10 16:38:34.216      3
3 2018-12-10 16:42:34.123      4
>>>

但是如您所见,数据框没有更改,因为这些组的等值为 'dt' 列 .

我想要的输出是:

dt  value
0 2018-12-10 16:35:34.246      3
1 2018-12-10 16:36:34.243      3
2 2018-12-10 16:38:34.216      3
3 2018-12-10 16:42:34.123      4

2 回答

  • 1

    (假设你的意思是前两个具有相同的分钟值 . )

    我不知道如何使用groupby,但这里有相同的结果:

    df=pd.DataFrame({'dt':pd.to_datetime(['2018-12-10 16:35:34.246',
                                          '2018-12-10 16:35:34.243',
                                          '2018-12-10 16:38:34.216',
                                          '2018-12-10 16:42:34.123']),
                                          'value':[1,2,3,4]})
    
                # Select the rows that are greater than a second less
                # And less than a second more
                # Get their value columns and sum them
    df['val'] = [df[(df.dt>t-pd.Timedelta(seconds=1))&
                    (df.dt<t+pd.Timedelta(seconds=1))]['value'].sum()
                 for t in df.dt]
    
                           dt  value  val
    0 2018-12-10 16:35:34.246      1    3
    1 2018-12-10 16:35:34.243      2    3
    2 2018-12-10 16:38:34.216      3    3
    3 2018-12-10 16:42:34.123      4    4
    

    作为旁注,我研究了 groupby 做同样的事情,但我无法弄清楚如何让它发挥作用 . 您可以将函数传递给 groupby 方法 . 如果您选择走这条路线,请注意该功能是接收Dataframe的索引 . 让's me think it would be hard to use the groupby since I don' t知道一行可以属于多个组......

  • 1

    一个强力解决方案是获取 datetime 系列和每个 datetime 值之间的绝对差值,然后与阈值进行比较:

    # data from @StephenCowley
    
    threshold = pd.Timedelta(seconds=1)
    
    df['val'] = [df.loc[(df['dt'] - t).abs() < threshold, 'value'].sum()
                 for t in df['dt']]
    
    print(df)
    
                           dt  value  val
    0 2018-12-10 16:35:34.246      1    3
    1 2018-12-10 16:35:34.243      2    3
    2 2018-12-10 16:38:34.216      3    3
    3 2018-12-10 16:42:34.123      4    4
    

相关问题