python - 有条件地计算列的最大值和最小值
问题描述
我有一个数据框如下:
row_no stock_name last_price Var1
1 SAIL 501.00 0
2 SAIL 501.60 23
3 SAIL 500.00 0
4 SAIL 499.10 0
5 SAIL 499.40 0
6 SAIL 499.40 0
7 SAIL 502.00 0
8 SAIL 497.95 0
9 SAIL 495.55 20
10 SAIL 496.75 0
11 SAIL 496.75 0
12 SAIL 513.00 0
13 SAIL 497.00 0
14 SAIL 497.20 0
15 SAIL 497.00 0
16 SAIL 494.00 0
17 SAIL 497.00 0
18 SAIL 497.00 0
19 SAIL 497.00 0
20 SAIL 496.60 -9
21 SAIL 497.25 0
Var1 不为零时需要计算 Max 和 Min last_price。
当当前 Var1 不等于 0 时,在 Var1 之前的非零值之间计算 Max 和 Min last_price。
示例:对于第 9 行:最大 last_price 计算为 Max(last_price from row 9 to row 2) = 502 和 Min last_price as Min(last_price from row 9 to row 2) = 495.55
我想要最终的数据框如下:
row_no stock_name last_price Var1 Max_LTP Min_LTP
1 SAIL 501 0 0 0 0
2 SAIL 501.6 23 501.6 501
3 SAIL 500 0 0 0 0
4 SAIL 499.1 0 0 0
5 SAIL 499.4 0 0 0
6 SAIL 499.4 0 0 0
7 SAIL 502 0 0 0 0
8 SAIL 497.95 0 0 0
9 SAIL 495.55 20 502 495.55
10 SAIL 496.75 0 0 0
11 SAIL 496.75 0 0 0
12 SAIL 513 0 0 0 0
13 SAIL 497 0 0 0 0
14 SAIL 497.2 0 0 0
15 SAIL 497 0 0 0 0
16 SAIL 494 0 0 0 0
17 SAIL 497 0 0 0 0
18 SAIL 497 0 0 0 0
19 SAIL 497 0 0 0 0
20 SAIL 496.6 -9 513 494
21 SAIL 497.25 0 0 0 0
解决方案
使用 Var1shift
并cumsum
创建组键,然后groupby
将min
和max
值分配回原始数据帧
mask=df.Var1.ne(0).shift().fillna(0).cumsum()
s=df.groupby(mask).last_price.agg(['min','max'])
s=s[df['Var1'].ne(0).groupby(mask).agg('any')]
s.index=df.index[df.Var1.ne(0)]
df[['Min_LTP','Max_LTP']]=s
df
Out[274]:
row_no stock_name last_price Var1 Max_LTP Min_LTP
0 1 SAIL 501.00 0 NaN NaN
1 2 SAIL 501.60 23 501.6 501.00
2 3 SAIL 500.00 0 NaN NaN
3 4 SAIL 499.10 0 NaN NaN
4 5 SAIL 499.40 0 NaN NaN
5 6 SAIL 499.40 0 NaN NaN
6 7 SAIL 502.00 0 NaN NaN
7 8 SAIL 497.95 0 NaN NaN
8 9 SAIL 495.55 20 502.0 495.55
9 10 SAIL 496.75 0 NaN NaN
10 11 SAIL 496.75 0 NaN NaN
11 12 SAIL 513.00 0 NaN NaN
12 13 SAIL 497.00 0 NaN NaN
13 14 SAIL 497.20 0 NaN NaN
14 15 SAIL 497.00 0 NaN NaN
15 16 SAIL 494.00 0 NaN NaN
16 17 SAIL 497.00 0 NaN NaN
17 18 SAIL 497.00 0 NaN NaN
18 19 SAIL 497.00 0 NaN NaN
19 20 SAIL 496.60 -9 513.0 494.00
20 21 SAIL 497.25 0 NaN NaN
推荐阅读
- python - 尝试在 tkinter 中编写一个 5 秒倒计时计时器
- android - Android:徽章周围的图像透明蒙版
- java - Android Studio 中的正确边距布局
- javascript - 使用Javascript根据索引将一个数组拆分为多个数组
- php - Windows 升级后 xampp 服务器不工作,我想在新窗口 11 中备份我的旧项目数据
- ios - viewport-fit=cover 不将视口扩展到 iOS Safari 上的状态栏区域(缺口附近)
- arrays - Laravel Collection/Array 找出两个结果之间的差异
- python - 如何在 Windows 11 中正确设置 pyspark?
- firebase - 由于双重加载配置错误,无法部署 Firebase 功能
- java - 我如何让用户将图像从画廊保存到他的 SharedPreferences?