2017-03-03 47 views
1

任何人都可以幫助我下面的語法?基本的Python查詢

我有一個pandas.DataFramedf並要執行:

if (df['Contract_Stage'] == "Stage 1"): 
    df['DaysToContractEnd'].fillna(600, inplace=True) 
elif(df['Contract_Stage']=="Stage 2"): 
    df['DaysToContractEnd'].fillna(350, inplace=True) 
elif(df['Contract_Stage']=="Stage 3"): 
    df['DaysToContractEnd'].fillna(150, inplace=True) 
elif(df['Contract_Stage']=="Stage 4"): 
    df['DaysToContractEnd'].fillna(-30, inplace=True) 

錯誤:

File "<ipython-input-27-140b902fd3f8>", line 1, in <module> 
if (df['Contract_Stage'] == "Stage 1"): 

File "C:\Program Files\Anaconda3\lib\site-packages\pandas\core\generic.py", line 892, in __nonzero__ 
.format(self.__class__.__name__)) 

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 
+0

問題不在於語法(儘管縮進在您發佈的內容中是錯誤的;我認爲它在實際代碼中是正確的)。錯誤消息告訴你該怎麼做 - 你有沒有試過它的建議? –

+0

是的縮進在真實代碼中是正確的。但我對Python非常陌生。試圖瞭解錯誤,但無法獲得它。你能幫我解決這個問題嗎? –

+0

我修正了壓痕。 – Alfe

回答

2

df['Contract_Stage'] == "Stage 1"將輸出的TrueFalse的載體,它的形狀是(df.shape [0] ,1)。

所以當你做if df['Contract_Stage'] == "Stage 1"也不可能將其評價爲TrueFalse

你可以做的是:

stage1 = df.loc[df['Contract_Stage'] == "Stage 1",'DaysToContractEnd'] 
stage1.fillna(600, inplace=True) 
df.loc[df['Contract_Stage'] == "Stage 1",'DaysToContractEnd'] = stage1 

這意味着:

  • 你列'DaysToContractEnd'爲條件df['Contract_Stage'] == "Stage 1"True的所有行,並將其分配給臨時變量stage1
  • stage1你用600填充na。
  • 您替換 條件df['Contract_Stage'] == "Stage 1"Truestage1的所有行的列'DaysToContractEnd'
+0

-packages \ pandas \ core \ generic.py:3191:SettingWithCopyWarning: 嘗試在DataFrame的切片副本上設置一個值 請參閱文檔中的注意事項:http://pandas.pydata.org /pandas-docs/stable/indexing.html#indexing-view-versus-copy self._update_inplace(new_data) –

+0

編輯我的答案 – arthur