Pandas使用get_dummies时如何补全缺失序列列并保持顺序
解决方案
问题根源是pd.get_dummies()默认仅为数据中实际出现的取值生成独热编码列,不会自动覆盖你期望的完整月份范围,因此会缺失未出现的2、5月列。以下两种方式都可以得到预期结果:
方案1:在现有代码基础上补全缺失列
保留你原有逻辑,运行完成后通过列重索引对齐指定的1-6月序列,缺失列自动填充0即可:
import pandas as pd # 示例数据 df = pd.DataFrame({'id': [1,1,1,1], 'month': [1,3,4,6]}) # 原有转换逻辑 ndf = df[['id']].join(pd.get_dummies(df['month'])).groupby('id').max() # 补全列:指定需要的完整月份范围,缺失值填0,同时自动按顺序排序列 full_month_cols = list(range(1, 7)) ndf = ndf.reindex(columns=full_month_cols, fill_value=0)
方案2:提前指定分类范围,自动生成全量列
将month字段转为Pandas分类类型,提前声明所有合法的月份取值,pd.get_dummies()识别到分类类型时会自动为所有分类生成列,无需后续补全:
import pandas as pd # 示例数据 df = pd.DataFrame({'id': [1,1,1,1], 'month': [1,3,4,6]}) # 将month转为指定取值范围的分类类型 df['month'] = pd.Categorical(df['month'], categories=range(1, 7)) # 直接做独热编码聚合 ndf = pd.get_dummies(df, columns=['month']).groupby('id').max() # 去掉列名的month_前缀,和原有输出格式保持一致 ndf.columns = [int(col.split('_')[1]) for col in ndf.columns]
两种方案最终输出结果一致,结构如下:
1 2 3 4 5 6 id 1 1 0 1 1 0 1
如果后续需要调整月份范围,只需要修改range(1,7)为你需要的起止区间即可。
内容的提问来源于stack exchange,提问作者Chimcootaa
相关产品推荐
相关产品推荐

