按数据框进行分组,其值仅小于第二秒-熊猫

时间:2018-12-10 06:58:00

标签: python pandas dataframe sum pandas-groupby

假设我有一个熊猫数据框,如下所示:

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

答案 0 :(得分:1)

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

我不确定如何使用groupby进行操作,但是这里的结果相同:

.pinched > :first-child:before {
 content: "";
    position: absolute;
    bottom: -20px;
    right: 0;
    width: 70%;
    height: 20px;
  background:#fff;
  /* css3 */
  -webkit-border-top-left-radius:15px;
  -moz-border-radius-topleft:15px;
  border-top-left-radius:15px;
}

作为旁注,我尝试使用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,因为我不知道一行可以属于多个组...

答案 1 :(得分: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