簡體   English   中英

pandas DataFrame 中的 for 循環/if 語句的問題

[英]Problems with a for loop/ if statement in a pandas DataFrame

我的代碼如下:

給出了 DataFrame

df.head(3)

           1. open  2. high  3. low 4. close  5. volume
date                    
2021-02-18  241.80  243.93  240.86  243.79  16925563.0
2021-02-17  241.32  244.31  240.94  244.20  21451617.0
2021-02-16  245.03  246.13  242.92  243.70  26728487.0

我添加了一個新列,將“4.close”與前一天的“4.close”進行比較。 那行得通。

for i in df["4. close"]:
    df["changeAbsolute"] = df["4. close"] - df["4. close"].shift(-1)

df.head(3)

1. open     2. high     3. low  4. close    5. volume   changeAbsolute
date                        
2021-02-18  241.8000    243.93  240.86  243.79  16925563.0  -0.41
2021-02-17  241.3200    244.31  240.94  244.20  21451617.0  0.50
2021-02-16  245.0300    246.13  242.92  243.70  26728487.0  -1.29

現在我的問題來了:

添加另一列時,如果 df["changeAbsolute"] 為正,則顯示“+”,如果為負,則顯示“-”,如果為 0,則顯示“unch”

for i in df["changeAbsolute"]:
    if i < 0:
        df["Change"] = "-"
    elif i > 0:
        df["Change"] = "+"
    else:
        df["Change"] = "unch"

df.head(3)

            1. open     2. high 3. low  4. close 5. volume  changeAbsolute      Change
date                            
2021-02-18  241.8000    243.93  240.86  243.79  16925563.0     -0.41             unch
2021-02-17  241.3200    244.31  240.94  244.20  21451617.0      0.50             unch
2021-02-16  245.0300    246.13  242.92  243.70  26728487.0     -1.29             unch

我期待:

            1. open     2. high 3. low  4. close 5. volume  changeAbsolute      Change
date                            
2021-02-18  241.8000    243.93  240.86  243.79  16925563.0     -0.41             -
2021-02-17  241.3200    244.31  240.94  244.20  21451617.0      0.50             +
2021-02-16  245.0300    246.13  242.92  243.70  26728487.0     -1.29             -

我更改了 if/elif/else 語句中的順序。 它沒有幫助。 我只回來了其他。 任何人都可以幫忙嗎?

您可以使用np.sign然后在此處使用Series.map

df['Change'] = np.sign(df['changeAbsolute']).map({1.0:'+', -1.0:'-', 0:'unch'})

或者,使用np.select

condList = [df['changeAbsolute']>0, df['changeAbsolute']<0]
choiceList = ['+', '-']
df['change'] = np.select(condList, choiceList, 'unch')

並改變這個

for i in df["4. close"]:
    df["changeAbsolute"] = df["4. close"] - df["4. close"].shift(-1)

df["changeAbsolute"] = df["4. close"] - df["4. close"].shift(-1)

為了使其更簡潔,您可以Series.diff執行相同的操作

df['changeAbsolute'] = df['4. close'].diff(-1)

為什么你的代碼給出錯誤的輸出看看這個例子

df["Change"] = "-"

這會將'-'分配給列中的每個值。

如果您仍然想使用,請嘗試以下操作:

df.iloc[idx, 'change'] = '-' # idx is the index of the row

在 Pandas 中,您可以一次處理整個列,這稱為矢量化

要計算df['changeAbsolute'] ,需要一個操作:

df["changeAbsolute"] = df["4. close"] - df["4. close"].shift(-1)

然后對於最后一列,您可以使用np.where

df['Change'] = np.where(df.changeAbsolute > 0, '+', np.where(
    df.changeAbsolute < 0, '-', 'unch'))

暫無
暫無

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

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