2017-09-15 81 views
2

我有一個數據框包含國家名稱&其能源產出的百分比。 根據國家的能源產出是高於還是低於能源產出的中位數,我需要添加一個分配1或0的新列。有些啞代碼:熊貓DataFrame - 基於其他列分配1,0值

import pandas as pd 
def answer(): 
    df = pd.DataFrame({'name':['china', 'america', 'canada'], 'output': [33.2, 15.0, 5.0]}) 
    df['newcol'] = df.where(df['output'] > df['output'].median(), 1, 0) 
    return df['newcol'] 
answer() 

代碼返回ValueError異常:數通過2項的錯誤,安置意味着1

我覺得這是一個非常簡單的解決方法,但我是新與大熊貓的工作。 請幫助結束我的沮喪

回答

1

@Vaishali解釋了爲什麼pd.DataFrame.where沒有按照您的預期工作,並建議您使用np.where來代替,這是非常好的建議。

我會提供你可以簡單地將你的布爾結果轉換爲整數。

設置

df = pd.DataFrame({ 
    'name':['china', 'america', 'canada'], 
    'output': [33.2, 15.0, 5.0] 
}) 

選項1

df['newcol'] = (df['output'] > df['output'].median()).astype(int) 

選項2
或更快但通過使用基礎numpy的陣列

o = df['output'].values 
df['newcol'] = (o > np.median(o)).astype(int) 
+0

嗯,總有 - 爲什麼我沒有想到:) – Vaishali

+0

非常感謝!我曾嘗試布爾掩碼,但努力重新格式化返回的True | False值。我對熊貓非常陌生,我發現它很難學習所有的文檔。你和@Vaishali已經非常翔實:) –

2

由於解決方案是矢量化的,您不需要循環。

df['newcol'] = np.where((df['output'] > df['output'].median()), 1, 0) 

    name output newcol 
0 china 33.2 1 
1 america 15.0 0 
2 canada 5.0  0 

對於傳錯的錯誤數量的項目,df.where與np.where有點不同。它返回與self相同形狀的對象,其對應條目來自self,其中cond爲True,否則爲其他。因此,它返回一個數據框在您的案例中的兩列而不是一系列,因此當您嘗試將該數據框分配給一個系列時,您會收到錯誤消息。

+0

我一直想知道爲什麼其他職位使用np.where!所以基本上我在做的是將整個df傳遞給我的新系列,這就是爲什麼它會拋出一個錯誤? –

+0

當你需要輸出是除boolean以外的任何數據類型時,np.where在if-else類型的場景中肯定非常有用。即使布爾值可以工作,但布爾掩碼更好。是的,你正在將一個df傳遞到新系列中,從而導致錯誤。 (df ['output']> df ['output']。median(),1,0) – Vaishali