NDO分组异常修复:pd.cut致NDO=0为NaN及热力图问题解决
解决NDO=0分组为NaN的问题及完整分组方案
问题根源
pd.cut默认采用左开右闭区间规则(right=True),如果你的分组边界起始值大于0(比如bins=[1,5,10,...]),NDO=0会落在所有区间之外,最终被标记为NaN。
正确分组方案
1. 定义包含0的分组边界与标签
直接将0纳入第一个分组区间,通过调整边界和参数确保0被正确匹配:
import pandas as pd # 定义分组边界:-1确保0被包含,后续按需求划分区间 bins = [-1, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 100] # 对应分组标签,与边界一一对应 labels = ['0天', '1-5天', '5-10天', '10-15天', '15-20天', '20-25天', '25-30天', '30-35天', '35-40天', '40-45天', '45-50天', '50-100天'] # 生成NDOGroup列,include_lowest=True确保左边界被包含 df['NDOGroup'] = pd.cut(df['NDO'], bins=bins, labels=labels, include_lowest=True)
2. 验证分组结果
快速检查NDO=0的行是否被正确分组:
# 查看NDO=0的分组分布 print(df[df['NDO'] == 0]['NDOGroup'].value_counts()) # 确认无NaN分组 print(df['NDOGroup'].isna().sum())
生成透视表与热力图
透视表示例
按国家和NDO分组聚合购票数,填充空值避免热力图缺失:
pivot_table = df.pivot_table( values='Purch', index='Country', columns='NDOGroup', aggfunc='sum', # 可替换为'mean'等聚合方式 fill_value=0 )
热力图绘制示例
import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize=(12, 8)) sns.heatmap(pivot_table, annot=True, fmt='g', cmap='YlGnBu') plt.title('各国不同购票提前天数的购票数热力图') plt.xlabel('距活动天数分组') plt.ylabel('国家') plt.show()
额外注意事项
- 若数据集存在NDO负数(如活动后补购),可将bins左边界设为
min(df['NDO']) - 1,确保所有值被覆盖 - 如需左闭右开区间,可设置
right=False,同时对应调整bins顺序与标签
内容的提问来源于stack exchange,提问作者niallygee
相关产品推荐
相关产品推荐

