我想计算df的每n行的min/max,例如10,但是使用df.rolling(10).max()给出0-9、1-10、2-11等行的值。我想要0-9,10-19,20-29等等。
对于大型数据集,是否有一种简洁的方法可以做到这一点?
谢谢
发布于 2020-02-05 12:33:10
使用np.arange
计算0
到len (df) -1
的数组,然后计算整个除数。我们可以将这个数组与DataFrame.groupby
一起使用。
n=9
df.groupby(np.arange(len(df))//n).max()
示例
设置
df=pd.DataFrame({'A':range(30)})
print(df)
A
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
15 15
16 16
17 17
18 18
19 19
20 20
21 21
22 22
23 23
24 24
25 25
26 26
27 27
28 28
29 29
溶液
n=9
df_max = df.groupby(np.arange(len(df))//n).max()
print(df_max)
A
0 8
1 17
2 26
3 29
如您所见,创建了从0到m的组。得到的DataFrame是每个组的最大值。
还可以选择要计算max
的列。
df.groupby(np.arange(len(df))//n)[cols].max()
当然,如果您想使用多个函数,请使用groupby.agg
。
细节
np.arange(len(df))//n
#array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
# 2, 2, 2, 2, 2, 3, 3, 3])
编辑
first_row = 2
df2 = df[first_row:]
df2.groupby(np.arange(len(df2))//n).max()
发布于 2020-02-05 12:36:11
成功的关键是按np.arange(len(df.index)) // 10分组(或将10 (组大小)更改为所需的任何其他值)。
假设有3列要计算min / max (“A”、“B”、“C”),则可以运行:
df.groupby(np.arange(len(df.index)) // 10)[['A', 'B', 'C']].agg(['min', 'max'])
https://stackoverflow.com/questions/60075839
复制相似问题