2017-03-15 39 views
-1

我試圖做下面的代碼:使用df.loc []和在

df.loc[df['Column'] in list]=1 
df.loc[df['Column'] not in list]=2 

但我有著名的錯誤

一個系列的真值是不明確的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

因此,從我瞭解的這個錯誤我已經得到,它是與邏輯鏈接。我想知道的是有沒有一個特定的錯字來做我想要做的事情,或者我需要擴展我的整個列表(在我的情況下這將是相當醜陋和長):

df.loc[df[('Column']=='a') & (df['Column']=='b')]=1 
df.loc[df[('Column']!='a') & (df['Column']!='b')]=2 

回答

2

我會用np.where。但是,您需要列名稱。

df['new_column'] = np.where(df['Column'].isin(lst), 1, 2) 

考慮名單lst和數據幀df

lst = [1, 2, 3] 
df = pd.DataFrame(dict(Column=[0, 1, 2, 3, 4])) 

然後

df['new_column'] = np.where(df['Column'].isin(lst), 1, 2) 

print(df) 

    Column new_column 
0  0   2 
1  1   1 
2  2   1 
3  3   1 
4  4   2 
+0

所以錯字較短,表現如何?因爲我正在做一個140k行這些操作很多df –

+0

@Mayeulsgc相對於什麼性能?你所選擇的答案甚至不是一個完整的答案。但是,'np.where'通常非常快。如果我有一個可行的替代解決方案,我會告訴你一個適當的比較。此外,未來的讀者選擇解決問題的答案更有益。 – piRSquared

+0

我到目前爲止選擇的解決方案正在爲我工​​作,基於性能時間 –

1

你正在尋找的功能是

df.loc[df['Column'].isin(list)] = 1 
+0

是有可能有它以消極的方式? –

+0

當然。只需使用df.loc [〜df ['Column']。isin(list)] = 1。〜可以用作不是 –

+0

啊好吧thx,我試了!表示沒有工作,太多java –