我有一个数据集,其中按活动结束天数 (NDO) 显示门票购买情况。
NDO | 购买 | 国家 |
---|---|---|
0 | 3 | 英国 |
1 | 3 | 英国 |
1 | 3 | 英国 |
1 | 3 | 美国 |
2 | 3 | 美国 |
我想按 NDO 将数据分组,例如 0 天、1-5 天、5-10 天、50-100 天,并添加一个额外的列“NDOGroup”,让我按 NDOGroup 创建数据透视表,最终是热图。
我为此使用的代码是:
bins = [-1,5,10,16,21,26,31,36,41,46,51,56,61,66,71,76,81,86,91,96,101]
labels = [f'{a0}-{a1 - 1}' for a0, a1 in zip(bins[:-2], bins[1:-1])] + [f'≥{bins[-2]}']
df['NDOGroup'] = pd.cut(df['NDO'], bins=bins, labels=labels, right=True)
countrypt = df.pivot_table(index = 'NDOGroup',columns = 'Country', values ='Purch', aggfunc='sum', observed=False)
plt.figure(figsize = (15,9))
sns.heatmap(countrypt, cmap = 'viridis', vmin=0, linewidths=0.5, linecolor='black')
但是生成的热图是这样的:
当我检查数据时,我发现对于 NDO=0,NDOGroup = NaN
NDO | 购买 | 国家 | NDO集团 |
---|---|---|---|
0 | 3 | 英国 | 南 |
1 | 3 | 英国 | 0-4 |
1 | 3 | 英国 | 0-4 |
1 | 3 | 美国 | 0-4 |
2 | 3 | 美国 | 0-4 |
我在垃圾箱中尝试了不同的索引,例如[-1,0,5],[-1,4,5] 但似乎无法让它显示正确的组。
这是索引问题吗?或者有没有一种更干净的方法可以解决这个问题,所以我得到如下表:
NDO | 购买 | 国家 | NDO集团 |
---|---|---|---|
0 | 3 | 英国 | 0 |
1 | 3 | 英国 | 1-5 |
3 | 3 | 英国 | 1-5 |
4 | 3 | 美国 | 1-5 |
5 | 3 | 美国 | 1-5 |
6 | 3 | 美国 | 6-10 |
12 | 3 | 美国 | 11-15 |
您可以使用:
df = pd.DataFrame({'NDO': [0, 1, 2, 5, 6, 10, 11, 15, 16, 91, 92, 96, 97, 1000]})
bins = [-np.inf,0,5,10,16,21,26,31,36,41,46,51,56,61,66,71,76,81,86,91,96,np.inf]
labels = ['0']+[f'{a0+1}-{a1}' for a0, a1 in zip(bins[1:-2], bins[2:-1])] + [f'≥{bins[-2]}']
df['NDOGroup'] = pd.cut(df['NDO'], bins=bins, labels=labels, right=True)
输出:
NDO NDOGroup
0 0 0
1 1 1-5
2 2 1-5
3 5 1-5
4 6 6-10
5 10 6-10
6 11 11-16
7 15 11-16
8 16 11-16
9 91 87-91
10 92 92-96
11 96 92-96
12 97 ≥96
13 1000 ≥96