按数量分组,不同大小的组

问题描述 投票:0回答:1

我有一个数据集,其中按活动结束天数 (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')

但是生成的热图是这样的:

heatmap

当我检查数据时,我发现对于 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
python pandas
1个回答
0
投票

您可以使用:

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
© www.soinside.com 2019 - 2024. All rights reserved.