phi*_*hem 5 python grouping numpy python-2.7 pandas
我有一个包含日期时间和整数的数据框
import numpy as np
import pandas as pd
df = pd.DataFrame()
df['dt'] = pd.date_range("2017-01-01 12:00", "2017-01-01 12:30", freq="1min")
df['val'] = np.random.choice(xrange(1, 100), df.shape[0])
Run Code Online (Sandbox Code Playgroud)
给我
dt val
0 2017-01-01 12:00:00 33
1 2017-01-01 12:01:00 42
2 2017-01-01 12:02:00 44
3 2017-01-01 12:03:00 6
4 2017-01-01 12:04:00 70
5 2017-01-01 12:05:00 94*
6 2017-01-01 12:06:00 42*
7 2017-01-01 12:07:00 97*
8 2017-01-01 12:08:00 12
9 2017-01-01 12:09:00 11
10 2017-01-01 12:10:00 66
11 2017-01-01 12:11:00 71
12 2017-01-01 12:12:00 25
13 2017-01-01 12:13:00 23
14 2017-01-01 12:14:00 39
15 2017-01-01 12:15:00 25
Run Code Online (Sandbox Code Playgroud)
我怎样才能找到连续的哪一N
组给我最大总和? dt
val
在这种情况下,如果N=3
,那么结果应该是:
dt val
5 2017-01-01 12:05:00 94
6 2017-01-01 12:06:00 42
7 2017-01-01 12:07:00 97
Run Code Online (Sandbox Code Playgroud)
(上面标有星星)
您可以使用rolling/sum
和np.nanargmax
查找与第一次出现的最大值关联的索引:
import numpy as np
import pandas as pd
df = pd.DataFrame({'dt': ['2017-01-01 12:00:00', '2017-01-01 12:01:00', '2017-01-01 12:02:00', '2017-01-01 12:03:00', '2017-01-01 12:04:00', '2017-01-01 12:05:00', '2017-01-01 12:06:00', '2017-01-01 12:07:00', '2017-01-01 12:08:00', '2017-01-01 12:09:00', '2017-01-01 12:10:00', '2017-01-01 12:11:00', '2017-01-01 12:12:00', '2017-01-01 12:13:00', '2017-01-01 12:14:00', '2017-01-01 12:15:00'], 'val': [33, 42, 44, 6, 70, 94, 42, 97, 12, 11, 66, 71, 25, 23, 39, 25]})
df.index = df.index*10
N = 3
idx = df['val'].rolling(window=N).sum()
i = np.nanargmax(idx) + 1
print(df.iloc[i-N : i])
Run Code Online (Sandbox Code Playgroud)
版画
dt val
50 2017-01-01 12:05:00 94
60 2017-01-01 12:06:00 42
70 2017-01-01 12:07:00 97
Run Code Online (Sandbox Code Playgroud)
iloc
使用序数索引.loc
使用基于标签的索引.条件是i-N
和i
是有效的索引,df.iloc[i-N : i]
将抓住的窗口长度的(子数据帧)N
.相反,如果索引使用连续的整数,df.loc[i-N, i]
则只会抓取一个长度窗口N
.上面的示例显示了一个DataFrame,df.loc
由于df.index
具有非连续的整数值,因此无法工作.
您可以使用np.convolve
获取正确的起始索引并从那里开始.
def cons_max(df, N):
max_loc = np.convolve(df.val, np.ones(N, dtype=int), mode='valid').argmax()
return df.loc[max_loc:max_loc+N-1]
Run Code Online (Sandbox Code Playgroud)
演示
>>> cons_max(df, 3)
dt val
5 2017-01-01 12:05:00 94
6 2017-01-01 12:06:00 42
7 2017-01-01 12:07:00 97
>>> cons_max(df, 5)
dt val
4 2017-01-01 12:04:00 70
5 2017-01-01 12:05:00 94
6 2017-01-01 12:06:00 42
7 2017-01-01 12:07:00 97
8 2017-01-01 12:08:00 12
Run Code Online (Sandbox Code Playgroud)
这可以有效地"滑动"我们的输入中的内核(一组数组),并将我们的大小窗口中的元素N
一起累加.