You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 16:27:31