簡體   English   中英

Python Pandas - 將一行中的一個值與前一行中兩個不同列中的兩個不同值進行比較

[英]Python Pandas - Compared a value in a row to two different values from two different columns in previous row

所以我有一個 dataframe df:

Date    High  Low   Open
2/5/21   100   10     50
3/5/21   110    5     65
4/5/21   220  180    200

我想使用 if 語句查看當天的開盤價是否在前一天的范圍內。 我想使用 if 語句,因為我將來可能想添加更多條件。

我嘗試創建一個 function:

def openloc(row):
    if row['Open'] <= row['High'].shift(-1) & row['Open'] >= row['Low'].shift(-1):
        return 'Yes'

df['inrange?'] = df.apply(openloc, axis = 1)

但我不斷收到錯誤消息:'float' object has no attribute 'shift'

有一個更好的方法嗎?

我設計的 output 將是這樣的:

Date    High  Low   Open  Inrange?
2/5/21   100   10     50   nan
3/5/21   110    5     65   yes
4/5/21   220  180    200   no

我不想返回 boolean 因為最終我可能想要添加比是或否更多的信息

您可以使用betweenshift使用向量化操作,無需應用:

df.assign(Inrange = df.Open.between(df.Low.shift(-1), df.High.shift(-1))
                           .shift()
                           .map({True:'Yes', False:'No'}))


     Date  High  Low  Open Inrange
0  2/5/21   100   10    50     NaN
1  3/5/21   110    5    65     Yes
2  4/5/21   220  180   200      No

一個np.where選項:

import numpy as np
import pandas as pd

df = pd.DataFrame({'Date': ['2/5/21', '3/5/21', '4/5/21'],
                   'High': [100, 110, 220],
                   'Low': [10, 5, 180],
                   'Open': [50, 65, 200]})

m = df['Open'].between(df['Low'].shift(-1), df['High'].shift(-1))
df['inrange?'] = np.where(m, 'Yes', 'No')
df['inrange?'] = df['inrange?'].shift()
print(df)
     Date  High  Low  Open inrange?
0  2/5/21   100   10    50      NaN
1  3/5/21   110    5    65      Yes
2  4/5/21   220  180   200       No

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM