2016-10-10 51 views
1

我想從我的熊貓數據框中創建直方圖。我有1列,我保存百分比值。我使用了value_counts(),但是我有太多的百分比值。 示例:在熊貓中對值進行分組value_counts()

0.752  1 
0.769  2 
0.800  1 
0.823  1 
      ... 
80.365  1 
84.000  1 
84.615  1 
85.000  10 
85.714  1 

我需要按照相同的比率對這些值進行分組。例如5%。 (0 - 4999,5000 - 9999時,...)我想這個結果:

(例)

0 - 4,999  24 
5 - 9,999  12 
10 - 14,999  30 
... 
+1

你的目標是隻創建一個直方圖?爲什麼不這樣做:'df.plot.hist()' –

+0

因爲這些值太多了,我想要在直方圖中有10-20列,而不是200 – Parfi

+0

你可以傳遞一個'bin'參數,例如:'' df.plot.hist(bins = 20)'會給你一個20列的直方圖。 –

回答

1

您可以將您的數據通過pd.cut()方法的結果:

In [38]: df 
Out[38]: 
    value count 
0 0.752  1 
1 11.769  3 
2 22.800  4 
3 33.823  5 
4 55.365  1 
5 84.000  1 
6 84.615  1 
7 85.000  10 
8 99.714  1 

In [39]: df.groupby(pd.cut(df.value, bins=np.linspace(0, 100, 21)))['count'].sum().fillna(0) 
Out[39]: 
value 
(0, 5]  1.0 
(5, 10]  0.0 
(10, 15]  3.0 
(15, 20]  0.0 
(20, 25]  4.0 
(25, 30]  0.0 
(30, 35]  5.0 
(35, 40]  0.0 
(40, 45]  0.0 
(45, 50]  0.0 
(50, 55]  0.0 
(55, 60]  1.0 
(60, 65]  0.0 
(65, 70]  0.0 
(70, 75]  0.0 
(75, 80]  0.0 
(80, 85]  12.0 
(85, 90]  0.0 
(90, 95]  0.0 
(95, 100]  1.0 
Name: count, dtype: float64 

或者你可以將NaN的:

In [40]: df.groupby(pd.cut(df.value, bins=np.linspace(0, 100, 21)))['count'].sum().dropna() 
Out[40]: 
value 
(0, 5]  1.0 
(10, 15]  3.0 
(20, 25]  4.0 
(30, 35]  5.0 
(55, 60]  1.0 
(80, 85]  12.0 
(95, 100]  1.0 
Name: count, dtype: float64 

說明:

In [41]: pd.cut(df.value, bins=np.linspace(0, 100, 21)) 
Out[41]: 
0  (0, 5] 
1  (10, 15] 
2  (20, 25] 
3  (30, 35] 
4  (55, 60] 
5  (80, 85] 
6  (80, 85] 
7  (80, 85] 
8 (95, 100] 
Name: value, dtype: category 
Categories (20, object): [(0, 5] < (5, 10] < (10, 15] < (15, 20] ... (80, 85] < (85, 90] < (90, 95] < (95, 100]] 
+0

看起來不錯。但是,當我在我的數據框上使用.value_counts()時,實際上有dtype:int64,沒有列的名稱。我可以從該圖表創建新的pd數據框嗎? – Parfi

+0

@Parfi,當然,你可以這樣做:'df.col_name.value_counts()。reset_index()' – MaxU

+0

工作完美,但這些總和是錯誤的。我不知道爲什麼。 (0,5)的結果是5,但肯定是錯誤的,總和會更高。哪裏可能出錯? – Parfi