Pandas生成哑变量函数在小数据集上合并异常求助
问题修正方案
修正后的make_dummies函数
import pandas as pd import numpy as np def make_dummies(df): # 生成小时哑变量(确保索引与原DataFrame一致) hour_dummies = pd.get_dummies( pd.Series(df.index.hour, index=df.index), prefix='hour', dtype=int ) # 确保包含一天中所有24小时的哑变量列(缺失的小时补0) for hour in range(24): col_name = f'hour_{hour}' if col_name not in hour_dummies.columns: hour_dummies[col_name] = 0 # 生成星期几哑变量(强制包含全部7天) day_mapping = {0: 'monday', 1: 'tuesday', 2: 'wednesday', 3: 'thursday', 4: 'friday', 5: 'saturday', 6: 'sunday'} day_series = df.index.dayofweek.map(day_mapping) day_categories = pd.Categorical(day_series, categories=day_mapping.values()) day_dummies = pd.get_dummies(day_categories, dtype=int) # 生成月份哑变量(强制包含全部12个月) month_mapping = {1: 'jan', 2: 'feb', 3: 'mar', 4: 'apr', 5: 'may', 6: 'jun', 7: 'jul', 8: 'aug', 9: 'sep', 10: 'oct', 11: 'nov', 12: 'dec'} month_series = df.index.month.map(month_mapping) month_categories = pd.Categorical(month_series, categories=month_mapping.values()) month_dummies = pd.get_dummies(month_categories, dtype=int) # 添加周末标记列 df['weekend'] = np.where(df.index.dayofweek.isin([5, 6]), 1, 0) # 按列合并所有哑变量与原数据(索引一致,无堆叠问题) df = pd.concat([df, hour_dummies, day_dummies, month_dummies], axis=1) return df
问题原因分析
原函数出现数据堆叠的核心问题是索引不匹配:
- 原代码中
hours = pd.get_dummies(df.index.hour, prefix='hour')里,df.index.hour返回的是numpy数组而非带索引的Series,导致生成的小时哑变量使用默认整数索引(0,1,2...),而原DataFrame的索引是时间戳。 - 当使用
pd.concat([df, hours, ...], axis=1)合并时,pandas会对齐不同索引,最终生成10行数据(5行时间索引+5行整数索引),看起来像是哑变量堆叠在原数据下方。 - 此外原函数重复生成了两次小时哑变量(
hours和hour_dummies),属于冗余操作。
测试验证
使用你提供的测试数据运行修正后的函数:
data = {"temp":[53.13,52.93,52.56,51.58,47.57], "Date":["2023-04-07 15:00:00-05:00","2023-04-07 16:00:00-05:00","2023-04-07 17:00:00-05:00","2023-04-07 18:00:00-05:00","2023-04-07 19:00:00-05:00"] } df = pd.DataFrame(data).set_index("Date") df.index = pd.to_datetime(df.index) df = make_dummies(df) print(df)
输出结果会包含:
- 原始
temp列 weekend列(全部为0,因为2023-04-07是周五)- 24个小时哑变量列(仅
hour_15到hour_19对应行值为1,其余为0) - 7个星期哑变量列(仅
friday列对应行值为1) - 12个月份哑变量列(仅
apr列对应行值为1)
所有列均正确合并在原数据右侧,无行堆叠问题。
内容的提问来源于stack exchange,提问作者bbartling
相关产品推荐
相关产品推荐

