Python将值传播到所有条件
我有这个数据框(看图片) 如果绿色列(Python将值传播到所有条件,python,pandas,dataframe,Python,Pandas,Dataframe,我有这个数据框(看图片) 如果绿色列(dataframe.Signal)为1,则红色列(dataframe.Level)等于示例1088.50中的某个值,否则dataframe.Level将为Nan 现在我想传播红色值(dataframe.Level),只要它小于或等于brown值(dataframe.brown) 当dataframe.Brown低于红色值dataframe.Level最后一次必须等于红色值时,它必须返回nan,就像照片中一样 我怎么能做这样的事我尝试对lops使用normal
dataframe.Signal
)为1,则红色列(dataframe.Level
)等于示例1088.50中的某个值,否则dataframe.Level
将为Nan
现在我想传播红色值(dataframe.Level
),只要它小于或等于brown值(dataframe.brown
)
当dataframe.Brown
低于红色值dataframe.Level
最后一次必须等于红色值时,它必须返回nan,就像照片中一样
我怎么能做这样的事我尝试对lops使用normal,但此数据帧包含600万行,速度太慢。TL;DR
left = df.loc[df["Signal"] == 1].index
right = df.loc[df["Brown"] - df["Level"].ffill() < 0] \
.groupby(df["Signal"].cumsum(), as_index=False) \
.nth(0).index
subsets = pd.cut(df.index, pd.IntervalIndex.from_arrays(left, right, closed="both"))
df = df.groupby(subsets).ffill()
Brown Signal Level
0 1089.00 0 NaN
1 1089.00 0 NaN
2 1088.50 0 NaN
3 1088.50 0 NaN
4 1088.50 1 1088.50 # 1088.50 <= start here (4)
5 1088.50 0 NaN # 1088.50
6 1088.50 0 NaN # 1088.50
7 1088.50 0 NaN # 1088.50
8 1088.50 0 NaN # 1088.50
9 1088.75 0 NaN # 1088.50
10 1088.50 0 NaN # 1088.50
11 1088.25 0 NaN # 1088.50 <= stop here (11)
12 1088.50 0 NaN
13 1088.25 1 1088.25 # 1088.25 <= start here (13)
14 1088.50 0 NaN # 1088.25
15 1088.50 0 NaN # 1088.25
16 1088.00 0 NaN # 1088.25 <= stop here (16)
17 1088.50 0 NaN
18 1088.75 0 NaN
19 1088.50 0 NaN
20 1088.25 0 NaN
21 1088.50 0 NaN
>>> left = df.loc[df["Signal"] == 1].index
>>> left
Int64Index([4, 13], dtype='int64')
>>> right = df.loc[df["Brown"] - df["Level"].ffill() < 0] \
.groupby(df["Signal"].cumsum(), as_index=False) \
.nth(0).index
>>> right
Int64Index([11, 16], dtype='int64')
>>> subsets = pd.cut(df.index, pd.IntervalIndex.from_arrays(left, right, closed="both"))
>>> list(subsets)
[nan,
nan,
nan,
nan,
Interval(4.0, 11.0, closed='both'),
Interval(4.0, 11.0, closed='both'),
Interval(4.0, 11.0, closed='both'),
Interval(4.0, 11.0, closed='both'),
Interval(4.0, 11.0, closed='both'),
Interval(4.0, 11.0, closed='both'),
Interval(4.0, 11.0, closed='both'),
Interval(4.0, 11.0, closed='both'),
nan,
Interval(13.0, 16.0, closed='both'),
Interval(13.0, 16.0, closed='both'),
Interval(13.0, 16.0, closed='both'),
Interval(13.0, 16.0, closed='both'),
nan,
nan,
nan,
nan,
nan]
>>> df.groupby(subsets).ffill()
Brown Signal Level
0 1089.00 0 NaN
1 1089.00 0 NaN
2 1088.50 0 NaN
3 1088.50 0 NaN
4 1088.50 1 1088.50
5 1088.50 0 1088.50
6 1088.50 0 1088.50
7 1088.50 0 1088.50
8 1088.50 0 1088.50
9 1088.75 0 1088.50
10 1088.50 0 1088.50
11 1088.25 0 1088.50
12 1088.50 0 NaN
13 1088.25 1 1088.25
14 1088.50 0 1088.25
15 1088.50 0 1088.25
16 1088.00 0 1088.25
17 1088.50 0 NaN
18 1088.75 0 NaN
19 1088.50 0 NaN
20 1088.25 0 NaN
21 1087.75 0 NaN