2017-06-01 15 views
1

我目前正試圖將一些數據處理爲10個分位數。如何使用pandas.qcut將列中的值作爲十進制數製作出來

我已經加載的數據幀具有列A,B和C

我當前的代碼可以打破他們到10個大小相等的團體,但我試圖基於斷行內的實際數量來實現。所以我想把它分成C列值相等的10個十分位數。這肯定意味着每個分區的十進制數將有不同數量的入口。這可能通過pd.qcut?任何人都可以將我指向正確的方向嗎?

當前代碼如下:

user_df['decile'] = pd.qcut(user_df['C'].rank(method='first').values, 10, duplicates='drop').codes + 1 
user_df.groupby('decile') 

我如何排序中列C的實際值?

謝謝!

回答

0

考慮數據框df

np.random.seed([3,1415]) 
df = pd.DataFrame(np.random.rand(100, 3), columns=list('ABC')) 

然後,我們可以建立一個基於'C'列嚴格單調一系列

c = df.C.values 
c -= c.min() 
c = c.cumsum() 

然後建立我們的桶的邊界

cuts = np.arange(11) * c[-1]/10 

最後分配一個新的列

df['decile'] = cuts.searchsorted(c) 
# equivalent but slower 
# df['decile'] = pd.cut(c, cuts, labels=range(1, 11)) 

它並不完美,因爲我建在什麼順序水桶他們出現

df.groupby('decile').C.sum() 

decile 
1  4.060410 
2  3.728364 
3  4.417033 
4  4.119732 
5  4.070618 
6  4.450897 
7  3.981932 
8  4.504357 
9  3.733634 
10 4.738445 
Name: C, dtype: float64 

然而,在1000

df.groupby('decile').C.sum() 

decile 
1  48.481552 
2  49.718306 
3  49.108860 
4  49.443570 
5  49.205949 
6  49.017016 
7  48.973904 
8  49.427361 
9  49.152014 
10 49.436423 
Name: C, dtype: float64 
+0

這並獲得成功!謝謝!!!與cumsum不熟悉,將不得不考慮這一點。 – Mojo713

相關問題