Python 熊猫-如果今天是过去N天内的最小值,则为真/假

Python 熊猫-如果今天是过去N天内的最小值,则为真/假,python,pandas,Python,Pandas,如果今天(当前行/值)是过去N天中最小的,我如何在显示真/假的数据框中创建另一列(称为条件) 例如,今天价格栏中的值(如下所示为2019年9月10日)为10。2019年9月10日之前最后八天的所有值都小于10,因此我希望条件列中今天(2019年9月10日)的值为真 DATE PRICE CONDITION 10/01/2019 43 FALSE 10/02/2019 44 FALSE 10/03/2019

如果今天(当前行/值)是过去N天中最小的,我如何在显示真/假的数据框中创建另一列(称为条件)

例如,今天价格栏中的值(如下所示为2019年9月10日)为10。2019年9月10日之前最后八天的所有值都小于10,因此我希望条件列中今天(2019年9月10日)的值为真

DATE          PRICE        CONDITION
10/01/2019    43           FALSE
10/02/2019    44           FALSE
10/03/2019    45           FALSE
10/04/2019    40           FALSE
10/05/2019    13           FALSE
10/06/2019    15           FALSE
10/07/2019    22           FALSE
10/08/2019    20           FALSE
10/09/2019    10           TRUE
10/10/2019    15           FALSE

这将应用于数据帧中的每一行。我想在没有iterows的情况下这样做,寻找一种矢量化的方式或滚动窗口之类的东西。

使用滚动窗口和
min(x)=x[-1]
我可以得到它。要使用
[-1]
我需要
raw=True

对于大小为
9
的窗口,问题首先生成
8行

使用

df['CONDITION'] = df['PRICE'].rolling(9).apply(lambda x:min(x) == x[-1], raw=True)
我明白了

接下来,我必须将
NaN
转换为
0
,然后我可以使用
.fillna(0).astype(bool)

结果

         DATE  PRICE  CONDITION
0  10/01/2019     43      False
1  10/02/2019     44      False
2  10/03/2019     45      False
3  10/04/2019     40      False
4  10/05/2019     13      False
5  10/06/2019     15      False
6  10/07/2019     22      False
7  10/08/2019     20      False
8  10/09/2019     10       True
9  10/10/2019     15      False

完整的工作示例

text = '''DATE          PRICE
10/01/2019    43
10/02/2019    44
10/03/2019    45
10/04/2019    40
10/05/2019    13
10/06/2019    15
10/07/2019    22
10/08/2019    20
10/09/2019    10
10/10/2019    15'''

import pandas as pd
import io

df = pd.read_csv(io.StringIO(text), sep='\s+')

df['CONDITION'] = df['PRICE'].rolling(9).apply(lambda x:min(x) == x[-1], raw=True).fillna(0).astype(bool)

print(df)

您能为这个问题添加一个示例数据框和预期输出吗?我刚刚添加了我在postmaybe中描述的基本示例,您需要它
         DATE  PRICE  CONDITION
0  10/01/2019     43      False
1  10/02/2019     44      False
2  10/03/2019     45      False
3  10/04/2019     40      False
4  10/05/2019     13      False
5  10/06/2019     15      False
6  10/07/2019     22      False
7  10/08/2019     20      False
8  10/09/2019     10       True
9  10/10/2019     15      False
text = '''DATE          PRICE
10/01/2019    43
10/02/2019    44
10/03/2019    45
10/04/2019    40
10/05/2019    13
10/06/2019    15
10/07/2019    22
10/08/2019    20
10/09/2019    10
10/10/2019    15'''

import pandas as pd
import io

df = pd.read_csv(io.StringIO(text), sep='\s+')

df['CONDITION'] = df['PRICE'].rolling(9).apply(lambda x:min(x) == x[-1], raw=True).fillna(0).astype(bool)

print(df)