Операция pd.cut
дает интервалы:
In [11]: pd.cut(df1["Range1"], [0,1,2,3,4,5,6,7,8,9,10,11,df1['Range1'].max()])
Out[11]:
12 (0, 1]
11 (1, 2]
0 (2, 3]
10 (3, 4]
3 (4, 5]
2 (6, 7]
9 (7, 8]
1 (8, 9]
8 (10, 11]
7 (11, 78]
5 (11, 78]
4 (11, 78]
6 (11, 78]
Name: Range1, dtype: category
Categories (12, interval[int64]): [(0, 1] < (1, 2] < (2, 3] < (3, 4] ... (8, 9] < (9, 10] < (10, 11] <
(11, 78]]
При использовании в операции groupby
они сопоставляются на основе индекса операции вырезания выше, а затем группируются и суммируются в соответствии суказанная вами операция.
В результате интервалы заканчиваются индексом в df2
:
In [14]: df2
Out[14]:
Range1 Range2
Range1
(0, 1] 1 1
(1, 2] 2 1
(2, 3] 3 3
(3, 4] 4 1
(4, 5] 5 2
(5, 6] 0 0
(6, 7] 7 2
(7, 8] 8 1
(8, 9] 9 2
(9, 10] 0 0
(10, 11] 11 1
(11, 78] 169 4
При использовании df2['Range2'].index.values
это будет array
из этихинтервалы, переданные в качестве первого аргумента bar
, который не может быть преобразован в число с плавающей точкой, как ожидает matplotlib.
Если вы хотите просто построить гистограмму df2.Range2
, и вы счастливы получитьинтервалы как метки оси, это будет работать:
plt.bar(range(len(df2)), df2.Range2.values, tick_label=df2.Range2.index.values)
и создаст это изображение для меня: