假设我有一个熊猫数据框,如下所示:
>>> 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
答案 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