2016-10-10 5 views
1

Ich möchte ein Histogramm aus meinem Pandas-Dataframe erstellen. Ich habe 1 Spalte, in der ich Prozentwerte speichere. Ich habe value_counts() verwendet, aber ich habe zu viele Prozentwerte. Beispiel:Gruppieren von Werten in Pandas 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 

Ich brauche diese Werte mit derselben Rate zu gruppieren. Zum Beispiel 5%. (0 - 4999, 5000 - 9999, ...) Ich möchte dieses Ergebnis:

(Beispiel)

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

Ihr Ziel ist es, nur ein Histogramm zu erstellen? Warum nein zu diesem: 'df.plot.hist()' –

+0

da diese Werte zu viel sind, möchte ich 10-20 Spalten im Histogramm haben, nicht 200 – Parfi

+0

können Sie ein 'bins' Argument dafür übergeben, Beispiel: ' df.plot.hist (bins = 20) 'gibt Ihnen ein Histogramm mit 20 Spalten. –

Antwort

1

Sie gruppieren können Ihre Daten durch das Ergebnis der pd.cut() Methode:

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 

alternativ können Sie Nans fallen:

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 

Erläuterung:

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

Sieht gut aus. Aber als ich .value_counts() auf meinem Datenrahmen verwendet habe, habe ich tatsächlich dtype: int64 ohne die Namen von Spalten. Kann ich einen neuen PD-Datenrahmen aus diesem Diagramm erstellen? – Parfi

+0

@Parfi, sicher, Sie können es auf diese Weise tun: 'df.col_name.value_counts(). Reset_index()' – MaxU

+0

Arbeit perfekt, aber diese Summen sind falsch. Ich weiß nicht warum. Das Ergebnis für (0,5) ist 5, aber es ist definitiv falsch. Sum wird höher sein. Wo kann der mögliche Fehler sein? – Parfi

Verwandte Themen