Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python将值传播到所有条件_Python_Pandas_Dataframe - Fatal编程技术网

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()

  • 查找停止索引(右间隔)它似乎不起作用,因为左和右的长度不同,如果您愿意帮助我,请通过电报@claudio314联系我,我将通过paypal向您捐赠您想要的任何东西。谢谢。请发布一个不起作用的示例。“左和右必须具有相同的长度”这是我运行上述脚本时遇到的错误,但它对输入数据有效,因为左和右具有相同的长度。为了帮助你,我需要一个它不起作用的例子。我仍然不明白RIGHT在做什么,我看到你想要获取棕色低于填充级别的索引,这是正确的假设,我不明白这是什么,我想这就是问题所在。groupby(df[“Signal”].cumsum(),as_index=False)。n(0)我非常确定这个问题是正确的,因为它没有做它应该做的,记住我只想在信号为1后传播,我想在棕色低于填充水平时停止传播
          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