【发布时间】:2020-01-02 07:57:45
【问题描述】:
我在下面给出了两个数据框供您测试
df = pd.DataFrame({
'subject_id':[1,1,1,1,1,1,1,1,1,1,1],
'time_1' :['2173-04-03 12:35:00','2173-04-03 17:00:00','2173-04-03
20:00:00','2173-04-04 11:00:00','2173-04-04 11:30:00','2173-04-04
12:00:00','2173-04-05 16:00:00','2173-04-05 22:00:00','2173-04-06
04:00:00','2173-04-06 04:30:00','2173-04-06 06:30:00'],
'val' :[5,5,5,10,5,10,5,8,3,8,10]
})
df1 = pd.DataFrame({
'subject_id':[1,1,1,1,1,1,1,1,1,1,1],
'time_1' :['2173-04-03 12:35:00','2173-04-03 12:50:00','2173-04-03
12:59:00','2173-04-03 13:14:00','2173-04-03 13:37:00','2173-04-04
11:30:00','2173-04-05 16:00:00','2173-04-05 22:00:00','2173-04-06
04:00:00','2173-04-06 04:30:00','2173-04-06 08:00:00'],
'val' :[5,5,5,5,10,5,5,8,3,4,6]
})
我想做的是
1) 在each day for each subject_id 中查找所有已为same for more than 1 hour 的值(来自val 列)并获取minimum of it
请注意,值也可以在 every 15 min duration 处捕获,因此您可能需要考虑 5 条记录才能看到 > 1 hr 条件)。请参阅下面的示例屏幕截图
2) 如果一天内没有same for more than 1 hour 的值,则只需获取minimum of that day for that subject_id
以下一个主题的屏幕截图将帮助您理解,我尝试过的代码如下
这是我尝试过的
df['time_1'] = pd.to_datetime(df['time_1'])
df['time_2'] = df['time_1'].shift(-1)
df['tdiff'] = (df['time_2'] - df['time_1']).dt.total_seconds() / 3600
df['reading_day'] = pd.DatetimeIndex(df['time_1']).day
# don't know how to apply if else condition here to check for 1 hr criteria
t1 = df.groupby(['subject_id','reading_start_day','tdiff])['val'].min()
由于我必须将其应用于数百万条记录,因此任何优雅高效的解决方案都会有所帮助
【问题讨论】:
-
正确语法:
df.groupby(['subject_id','reading_start_day','tdiff])['val'].min() if tdiff > 1 else do_something -
但这并没有给出预期的输出
-
@shaikmoed - 你确定这是语法吗?它不起作用
-
什么是df['time_2']?我在上面的数据框中没有看到 time_2 列..
-
我已经在代码中创建了该列。参考我的代码
标签: python python-3.x pandas vectorization pandas-groupby