2016-08-12 89 views
3

我有一個數據幀熊貓柱的,其一個的的.loc函數爲:使用大熊貓數據幀

a = [1,0,1,0,1,3,4,6,4,6] 

現在我想創建另一列,使得大於0且小於5的任何值是分配1,將其餘的分配0,即:

a = [1,0,1,0,1,3,4,6,4,6] 
b = [1,0,1,0,1,1,1,0,1,0] 

現在我已經做到了這一點

dtaframe['b'] = dtaframe['a'].loc[0 < dtaframe['a'] < 5] = 1 
dtaframe['b'] = dtaframe['a'].loc[dtaframe['a'] >4 or dtaframe['a']==0] = 0 

但碼T徘徊和錯誤。該怎麼辦 ?

回答

2

當使用比較運算符和布爾邏輯來過濾數據框時,不能使用a < myseries < b的pythonic慣用語。相反,你需要(a < myseries) & (myseries < b)

cond1 = (0 < dtaframe['a']) 
cond2 = (dtaframe['a'] <= 5) 
dtaframe['b'] = (cond1 & cond2) * 1 
+1

我昨天瞭解它,也有'myseries.between( a,b)'([docs](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.between.html)) – ayhan

+1

@ayhan我也想包括: - ) – piRSquared

+0

@piRSquared它似乎在拋出一些錯誤或:('ValueError:一個Series的真值不明確。使用a.empty,a.bool(),a.item(),a.any()或a.all()'。 –

4

您可以使用between獲得布爾值,然後astype從布爾值轉換爲0/1:

dtaframe['b'] = dtaframe['a'].between(0, 5, inclusive=False).astype(int) 

輸出結果:

a b 
0 1 1 
1 0 0 
2 1 1 
3 0 0 
4 1 1 
5 3 1 
6 4 1 
7 6 0 
8 4 1 
9 6 0 

編輯

對於多個範圍,你可以使用pandas.cut

dtaframe['b'] = pd.cut(dtaframe['a'], bins=[0,1,6,9], labels=False, include_lowest=True) 

你需要小心你如何定義bins。使用labels=False將返回每個bin的整數指示符,它恰好與您提供的標籤相對應。您還可以手動指定每個垃圾箱的標籤,例如labels=[0,1,2],labels=[0,17,19],labels=['a','b','c']等。如果您手動指定標籤,則可能需要使用astype,因爲它們將作爲類別返回。

或者,你可以結合locbetween手動指定每個範圍:

dtaframe.loc[dtaframe['a'].between(0,1), 'b'] = 0 
dtaframe.loc[dtaframe['a'].between(2,6), 'b'] = 1 
dtaframe.loc[dtaframe['a'].between(7,9), 'b'] = 2 
+0

你打我吧 – piRSquared

+0

@root輝煌的答案:)如果我必須做3班。如從0-1分配0,2-6分配1,最後從7-9分配3。謝謝你的回答 –

+0

@AuuragPandey:我已經做了一個編輯來解決多個範圍。儘管如此,您可能希望將其作爲一個單獨的問題,以獲得更多的意見。我的方法可能不是最佳的。 – root

1

np.where試試這個:

dtaframe['b'] = np.where(([dtaframe['a'] > 4) | (dtaframe['a']==0),0, dtaframe['a'])