Python 熊猫-如果今天是过去N天内的最小值,则为真/假
如果今天(当前行/值)是过去N天中最小的,我如何在显示真/假的数据框中创建另一列(称为条件) 例如,今天价格栏中的值(如下所示为2019年9月10日)为10。2019年9月10日之前最后八天的所有值都小于10,因此我希望条件列中今天(2019年9月10日)的值为真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
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)