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

如何在Pandas中为相互依赖的类别创建虚拟变量?

优雅生成日期×时间段的交叉虚拟变量

嘿,这个需求太常见了——在交通流量预测这类时间相关的建模任务里,日期和时间段的交互效应确实关键,单独的虚拟变量完全没法捕捉这种依赖关系。你尝试用df.Day * df.Time的思路方向是对的,但确实有更清晰、更优雅的实现方式,下面给你分享几种常用的方法:

方法一:显式创建带分隔符的交叉列(最直观)

这种方式手动拼接日期和时间段为一个新列,再生成虚拟变量,好处是列名清晰易懂,不会出现数字拼接混淆的问题:

import pandas as pd

df = pd.DataFrame({
    'Day': ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
    'Time': [11,15,9,15,17,10,20],
    'Count': [100,150,150,150,180,60,50]
})

# 用下划线拼接Day和Time,生成可读性强的交叉列
df['Day_Time'] = df['Day'] + '_' + df['Time'].astype(str)
# 生成交叉虚拟变量,prefix设为空可以去掉默认前缀
df_dummies = pd.get_dummies(df['Day_Time'], prefix='')

print(df_dummies)

输出的列名会是Mon_11、Tue_15这种清晰的格式,后续建模时一眼就能识别对应的组合。

方法二:用pd.crosstab直接生成交叉虚拟变量

如果你不想手动创建交叉列,可以用pd.crosstab直接基于两个类别列生成交叉表,再处理列名即可:

import pandas as pd

df = pd.DataFrame({
    'Day': ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
    'Time': [11,15,9,15,17,10,20],
    'Count': [100,150,150,150,180,60,50]
})

# 生成以原数据索引为行,Day和Time为列的交叉表
cross_dummies = pd.crosstab(df.index, [df['Day'], df['Time']])
# 将多级列名转换为Day_Time的格式
cross_dummies.columns = ['_'.join(map(str, col)) for col in cross_dummies.columns]
# 可以直接合并到原数据中
df_with_dummies = df.join(cross_dummies)

print(cross_dummies)

这个方法会自动识别所有唯一的Day-Time组合,不需要提前拼接列,适合数据量较大、组合较多的场景。

方法三:用scikit-learn实现(适合机器学习流水线)

如果你的目标是构建完整的机器学习建模流水线,用OneHotEncoder结合ColumnTransformer会更规范,能无缝集成到后续的训练流程中:

from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
import pandas as pd

df = pd.DataFrame({
    'Day': ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
    'Time': [11,15,9,15,17,10,20],
    'Count': [100,150,150,150,180,60,50]
})

# 定义列转换器,对Day和Time列进行OneHot编码(生成所有交叉组合)
ct = ColumnTransformer(
    transformers=[
        ('day_time_onehot', OneHotEncoder(sparse_output=False, drop=None), ['Day', 'Time'])
    ],
    remainder='passthrough'  # 保留Count等其他原始列
)

# 转换数据并转回DataFrame
transformed_data = ct.fit_transform(df)
feature_names = ct.get_feature_names_out()
df_transformed = pd.DataFrame(transformed_data, columns=feature_names)

print(df_transformed)

这种方法的优势在于可以和Pipeline、GridSearchCV等工具结合,而且如果未来遇到训练数据中没有的Day-Time组合,设置handle_unknown='ignore'就能自动忽略,避免报错。


内容的提问来源于stack exchange,提问作者Jeroen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:41:22