python pandas 中的 Mumbojumbo .rolling() .max() .groupby() 组合
Mumbojumbo .rolling() .max() .groupby() combination in python pandas
我希望对 B 列“groupedby”日期(A 列值)进行“滚动”.max() .min()。但是,诀窍是它应该再次从每一行开始,所以我不能使用例如 df['MAX'] = df['B'].rolling(10).max().shift(- 9)(因为我需要在组结束的地方结束它——每个组可以有不同的行数)或者简单地按 A 列分组(因为我需要滚动最大最小值,在每一行开始并在每个组结束的地方结束——这意味着第1行C列是B列第1-4行的最大值,对于第2行C列是B列第2-4行的最大值,对于第3行C列是B列第3-4行的最大值,对于第4行C 列是 B 列第 4 行的最大值,等等。)。希望它有意义 - C 列和 D 列是所需的结果。提前谢谢大家。
A B C(max) D(min)
1 2016-01-01 0 7 0
2 2016-01-01 7 7 3
3 2016-01-01 3 4 3
4 2016-01-01 4 4 4
5 2016-01-02 2 5 1
6 2016-01-02 5 5 1
7 2016-01-02 1 1 1
8 2016-01-03 1 4 1
9 2016-01-03 3 4 2
10 2016-01-03 4 4 2
11 2016-01-03 2 2 2
df['C_max'] = df.groupby('A')['B'].transform(lambda x: x[::-1].cummax()[::-1])
df['D_min'] = df.groupby('A')['B'].transform(lambda x: x[::-1].cummin()[::-1])
A B C(max) D(min) C_max D_min
1 2016-01-01 0 7 0 7 0
2 2016-01-01 7 7 3 7 3
3 2016-01-01 3 4 3 4 3
4 2016-01-01 4 4 4 4 4
5 2016-01-02 2 5 1 5 1
6 2016-01-02 5 5 1 5 1
7 2016-01-02 1 1 1 1 1
8 2016-01-03 1 4 1 4 1
9 2016-01-03 3 4 2 4 2
10 2016-01-03 4 4 2 4 2
11 2016-01-03 2 2 2 2 2
我希望对 B 列“groupedby”日期(A 列值)进行“滚动”.max() .min()。但是,诀窍是它应该再次从每一行开始,所以我不能使用例如 df['MAX'] = df['B'].rolling(10).max().shift(- 9)(因为我需要在组结束的地方结束它——每个组可以有不同的行数)或者简单地按 A 列分组(因为我需要滚动最大最小值,在每一行开始并在每个组结束的地方结束——这意味着第1行C列是B列第1-4行的最大值,对于第2行C列是B列第2-4行的最大值,对于第3行C列是B列第3-4行的最大值,对于第4行C 列是 B 列第 4 行的最大值,等等。)。希望它有意义 - C 列和 D 列是所需的结果。提前谢谢大家。
A B C(max) D(min)
1 2016-01-01 0 7 0
2 2016-01-01 7 7 3
3 2016-01-01 3 4 3
4 2016-01-01 4 4 4
5 2016-01-02 2 5 1
6 2016-01-02 5 5 1
7 2016-01-02 1 1 1
8 2016-01-03 1 4 1
9 2016-01-03 3 4 2
10 2016-01-03 4 4 2
11 2016-01-03 2 2 2
df['C_max'] = df.groupby('A')['B'].transform(lambda x: x[::-1].cummax()[::-1])
df['D_min'] = df.groupby('A')['B'].transform(lambda x: x[::-1].cummin()[::-1])
A B C(max) D(min) C_max D_min
1 2016-01-01 0 7 0 7 0
2 2016-01-01 7 7 3 7 3
3 2016-01-01 3 4 3 4 3
4 2016-01-01 4 4 4 4 4
5 2016-01-02 2 5 1 5 1
6 2016-01-02 5 5 1 5 1
7 2016-01-02 1 1 1 1 1
8 2016-01-03 1 4 1 4 1
9 2016-01-03 3 4 2 4 2
10 2016-01-03 4 4 2 4 2
11 2016-01-03 2 2 2 2 2