pd.cut
из pandas группируются по диапазону. Его можно использовать для создания нового столбца AgeGroup, который будет использоваться в качестве входных данных для pd.crosstab
. Параметр labels
в pd.cut
может установить соответствующий текст, который будет использоваться в качестве y-тиков. right=False
заботится о возрастах, равных границе корзины, помещая их в верхнюю корзину. Пример кода:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
df = pd.read_csv('http://www.ishelp.info/data/bikebuyers_original.csv')
df.rename(columns={"Purchased Bike": "purch_bike"}, inplace=True)
# bins = list(range(0, 80, 10)) + [120]
bins = [20, 28, 35, 42, 49, 56, 63, 70, 77, 84, 91, 120]
labels = [f'{a0}-{a1 - 1}' for a0, a1 in zip(bins[:-2], bins[1:-1])] + [f'≥{bins[-2]}']
df['AgeGroup'] = pd.cut(df.Age, bins=bins, labels=labels, right=False)
sns.heatmap(pd.crosstab(df.AgeGroup, df.purch_bike), annot=True, fmt='d')
plt.yticks(rotation=0)
plt.show()