簡體   English   中英

在 Pandas dataframe 中,如何根據每一行的值在 append 中創建一個新的 True / False 列?

[英]In Pandas dataframe, how to append a new column of True / False based on each row's value?

我正在嘗試根據特定條件為每一行創建一個 dataframe 的股票價格和 append 一個 True/False 列。

ind = [0,1,2,3,4,5,6,7,8,9]
close = [10,20,30,40,30,20,30,40,50]
open = [11,21,31,41,31,21,31,41,51]
upper = [11,21,31,41,31,21,31,41,51]
mid = [11,21,31,41,31,21,31,41,51]
cond1 = [True,True,True,False,False,True,False,True,True]
cond2 = [True,True,False,False,False,False,False,False,False]
cond3 = [True,True,False,False,False,False,False,False,False]
cond4 = [True,True,False,False,False,False,False,False,False]
cond5 = [True,True,False,False,False,False,False,False,False]

def check_conds(df, latest_price):
    ''''1st set of INT for early breakout of bollinger upper''' 
    df.loc[:, ('cond1')] = df.close.shift(1) > df.upper.shift(1)
    df.loc[:, ('cond2')] = df.open.shift(1) < df.mid.shift(1).rolling(6).min()
    df.loc[:, ('cond3')] = df.close.shift(1).rolling(7).min() <= 21
    df.loc[:, ('cond4')] = df.upper.shift(1) < df.upper.shift(2)
    df.loc[:, ('cond5')] = df.mid.tail(3).max() < 30
    df.loc[:, ('Overall')] = all([df.cond1,df.cond2,df.cond3,df.cond4,df.cond5])    
    return df

原始的 9 行乘 4 列 dataframe 僅包含關閉/打開/上/中列。

check_conds 函數很好地返回 df,新的 cond1-5 列返回 True / False 為每一行附加,從而產生一個 dataframe 9 行乘 9 列。

但是,當我嘗試應用另一個邏輯來為每一行提供基於 cond1-5 的“總體”真/假時,我收到“ValueError:系列的真值不明確。使用 a.empty, a.bool( )、a.item()、a.any() 或 a.all()。”

df.loc[:, ('Overall')] = all([df.cond1,df.cond2,df.cond3,df.cond4,df.cond5])

所以我試着拔出每一個cond1-5,那些確實是真/假系列。 我如何在 function 中使用最后一行來檢查每一行的 cond1-5 並在該行的所有 cond1-5 為 True 時返回 True?

只是無法理解為什么 function 中的 cond1-5 行可以正常工作,只是比較每一行中的值,但是上面最后一行(以類似的風格編寫)正在返回整個系列。

請指教!

該錯誤告訴您使用pd.DataFrame.all 要檢查所有條件下每行的所有值是否為真,您必須指定參數axis=1

df.loc[:, df.columns.str.startswith('cond')].all(axis=1)

請注意, df.columns.str.startswith('cond')只是選擇所有以'cond'開頭的列的一種懶惰方式。 當然,您可以使用df[['cond1', 'cond2', 'cond3', 'cond4', 'cond5']]實現相同的效果。

暫無
暫無

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

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