2014-09-30 40 views
0

簡單的問題,這裏介於編號:更換兩個值(熊貓,Python3)

b = 8143.1795845088482 
d = 14723.523658084257 

我Df的所謂最後:

Words  score 
This  90374.98788 
is  80559.4495 
a   43269.67002 
sample 34535.01172 
output Very Low 

我想替換所有以「很低的分數','低','中等'或'高',這取決於它們是否落在四分位數範圍之間。

是這樣工作的:

final['score'][final['score'] <= b] = 'Very Low' #This is shown in the example above 

,但是當我試圖立即播放此之後它不工作:

final['score'][final['score'] >= b] and final['score'][final['score'] <= d] = 'Low' 

這給我的錯誤:無法賦值運算符。任何人都知道我錯過了什麼?

回答

1

如果你的數據幀的分數都花車,

In [234]: df 
Out[234]: 
    Words  score 
0 This 90374.98788 
1  is 80559.44950 
2  a 43269.67002 
3 sample 34535.01172 

那麼你可以使用pd.qcut歸類其四分位的每個值:

In [236]: df['quartile'] = pd.qcut(df['score'], q=4, labels=['very low', 'low', 'medium', 'high']) 

In [237]: df 
Out[237]: 
    Words  score quartile 
0 This 90374.98788  high 
1  is 80559.44950 medium 
2  a 43269.67002  low 
3 sample 34535.01172 very low 

DataFrame列有一個dtype。當這些值都是浮點數時,它就有一個float dtype,對於數值計算來說這個速度非常快。當這些值是浮點數和字符串的混合時,那麼dtype是object,這意味着每個值都是一個Python對象。雖然這給這些值帶來了很大的靈活性,但它也非常緩慢,因爲每個操作最終都會回到調用Python函數而不是NumPy/Panda C/Fortran/Cython函數。因此,您應該儘量避免將浮標和字符串混合在一個列中。

1

首先,你必須使用按位(如&|代替andor)因爲你是比較陣列,因此所有的值,而不是一個單一的價值運營商(變成ambiguoous比較像這樣的陣列,再加上你不能覆蓋全球and運營商的行爲就像你想要的),其次,由於運營商優先權,你必須在多個條件下使用括號。

最後要執行chain indexing這可能會或可能無法正常工作,並會提出一個警告,設置您的列值使用loc這樣的:

In [4]: 

b = 25 
d = 50 
final.loc[(final['score'] >= b) & (final['score'] <= d), 'score'] = 'Low' 
final 
Out[4]: 
    Words score 
0 This 10 
1 is Low 
2 for Low 
3 You 704 
+0

嗨,埃德,這會引發以下錯誤:ValueError:數組是不同的長度:58對1 – user3682157 2014-09-30 22:52:22

+0

你將不得不編輯有效的輸入數據和你的代碼,我重現你的錯誤。在您發佈的數據上,您發佈的代碼可以正常工作。 – EdChum 2014-09-30 22:53:50

+0

更新,我沒有絲毫爲什麼這個錯誤被拋出 - OP更新 – user3682157 2014-09-30 23:13:52