web-dev-qa-db-fra.com

Pandas graphique à barres avec plage groupée

Existe-t-il un moyen de créer un graphique à barres à partir de données continues regroupées en intervalles prédéfinis? Par exemple,

In[1]: df
Out[1]: 
0      0.729630
1      0.699620
2      0.710526
3      0.000000
4      0.831325
5      0.945312
6      0.665428
7      0.871845
8      0.848148
9      0.262500
10     0.694030
11     0.503759
12     0.985437
13     0.576271
14     0.819742
15     0.957627
16     0.814394
17     0.944649
18     0.911111
19     0.113333
20     0.585821
21     0.930131
22     0.347222
23     0.000000
24     0.987805
25     0.950570
26     0.341317
27     0.192771
28     0.320988
29     0.513834

231    0.342541
232    0.866279
233    0.900000
234    0.615385
235    0.880597
236    0.620690
237    0.984375
238    0.171429
239    0.792683
240    0.344828
241    0.288889
242    0.961686
243    0.094402
244    0.960526
245    1.000000
246    0.166667
247    0.373494
248    0.000000
249    0.839416
250    0.862745
251    0.589873
252    0.983871
253    0.751938
254    0.000000
255    0.594937
256    0.259615
257    0.459916
258    0.935065
259    0.969231
260    0.755814

et au lieu d'un simple histogramme:

df.hist()

usual histogram of df

Je dois créer un graphique à barres, où chaque barre comptera un certain nombre d'instances dans une plage prédéfinie. Par exemple, le tracé suivant doit avoir trois barres avec le nombre de points qui tombent dans: [0 0,35], [0,35 0,7] [0,7 1,0]

[~ # ~] modifier [~ # ~]

Merci beaucoup pour vos réponses. Une autre question, comment commander des bacs? Par exemple, j'obtiens le résultat suivant:

In[349]: out.value_counts()
Out[349]:  
[0, 0.001]      104
(0.001, 0.1]     61
(0.1, 0.2]       32
(0.2, 0.3]       20
(0.3, 0.4]       18
(0.7, 0.8]        6
(0.4, 0.5]        6
(0.5, 0.6]        5
(0.6, 0.7]        4
(0.9, 1]          3
(0.8, 0.9]        2
(1, 1.001]        0

comme vous pouvez le voir, les trois derniers bacs ne sont pas commandés. Comment trier le bloc de données en fonction des "catégories" ou de mes bacs?

EDIT 2

Je viens de trouver comment le résoudre, simplement avec 'reindex ()':

In[355]: out.value_counts().reindex(out.cat.categories)
Out[355]: 
[0, 0.001]      104
(0.001, 0.1]     61
(0.1, 0.2]       32
(0.2, 0.3]       20
(0.3, 0.4]       18
(0.4, 0.5]        6
(0.5, 0.6]        5
(0.6, 0.7]        4
(0.7, 0.8]        6
(0.8, 0.9]        2
(0.9, 1]          3
(1, 1.001]        0
13
Arnold Klein

Vous pouvez utiliser pd.cut pour partitionner les valeurs en cases correspondant à chaque intervalle, puis prendre le nombre total de chaque intervalle à l'aide de pd.value_counts . Tracez un graphique à barres plus tard, remplacez également les étiquettes des graduations de l'axe X par le nom de la catégorie à laquelle appartient cette graduation particulière.

out = pd.cut(s, bins=[0, 0.35, 0.7, 1], include_lowest=True)
ax = out.value_counts(sort=False).plot.bar(rot=0, color="b", figsize=(6,4))
ax.set_xticklabels([c[1:-1].replace(","," to") for c in out.cat.categories])
plt.show()

enter image description here


Si vous souhaitez que l'axe Y soit affiché sous forme de pourcentages relatifs, normalisez le nombre de fréquences et multipliez ce résultat par 100.

out = pd.cut(s, bins=[0, 0.35, 0.7, 1], include_lowest=True)
out_norm = out.value_counts(sort=False, normalize=True).mul(100)
ax = out_norm.plot.bar(rot=0, color="b", figsize=(6,4))
ax.set_xticklabels([c[1:-1].replace(","," to") for c in out.cat.categories])
plt.ylabel("pct")
plt.show()

enter image description here

22
Nickil Maveli

Vous pouvez envisager d'utiliser matplotlib pour tracer l'histogramme. Contrairement à la fonction hist des pandas, matplotlib.pyplot.hist accepte un tableau en entrée pour les bacs.

import numpy as np; np.random.seed(0)
import matplotlib.pyplot as plt
import pandas as pd

x = np.random.Rand(120)
df = pd.DataFrame({"x":x})

bins= [0,0.35,0.7,1]
plt.hist(df.values, bins=bins, edgecolor="k")
plt.xticks(bins)

plt.show()

enter image description here

12

Vous pouvez utiliser pd.cut

bins = [0,0.35,0.7,1]
df = df.groupby(pd.cut(df['val'], bins=bins)).val.count()
df.plot(kind='bar')

enter image description here

8
Vaishali