Python Pandas:重构虚拟日期列数据为行以适配机器学习模型
解决Pandas中因变量宽格式转长格式以匹配自变量结构的问题
没问题,这是典型的宽表转长表场景,用Pandas的melt()方法就能完美解决,让你的因变量数据结构和自变量对齐,方便后续模型训练。
步骤1:先模拟你的数据(方便你直接测试)
先把你给出的示例数据用Pandas构造出来,这样你可以直接运行代码看效果:
import pandas as pd # 自变量(长格式:id + month/year 为唯一键) df_features = pd.DataFrame({ 'id': [0, 0, 1], 'month/year': ['01/2016', '02/2016', '01/2016'], 'var_a': [1, 2, 2], 'var_b': [2, 1, 3] }) # 因变量(宽格式:每个月份作为列) df_target = pd.DataFrame({ 'id': [0, 1, 2], '01/2016': [1, 1, 0], '02/2016': [1, 0, 0] })
步骤2:将因变量转为长格式
用pd.melt()把宽格式的因变量拆解成和自变量一致的结构:
# 宽表转长表,对齐自变量的id + month/year结构 df_target_long = df_target.melt( id_vars='id', # 保持id列不变 var_name='month/year', # 把原月份列名转为这一列的取值 value_name='target' # 原单元格的0/1值转为目标变量列 )
转换后的df_target_long结构如下:
| id | month/year | target |
|---|---|---|
| 0 | 01/2016 | 1 |
| 1 | 01/2016 | 1 |
| 2 | 01/2016 | 0 |
| 0 | 02/2016 | 1 |
| 1 | 02/2016 | 0 |
| 2 | 02/2016 | 0 |
现在它的结构就和你的自变量完全匹配了:id + month/year 作为唯一组合,每行对应一个时间点的目标值。
步骤3:合并特征和目标变量(可选但推荐)
为了方便后续模型训练,你可以把两个DataFrame按id和month/year合并:
# 左合并保留所有特征行,避免丢失数据 df_combined = pd.merge(df_features, df_target_long, on=['id', 'month/year'], how='left')
如果某些id+month/year在因变量中没有对应值,target列会出现NaN,你可以根据业务需求处理(比如填充0,或者删除这些行)。
额外注意事项
- 格式一致性:确保因变量的月份列名和自变量的
month/year列格式完全一致(比如都是MM/YYYY),如果有差异,可以用pd.to_datetime()统一格式:# 统一日期格式为MM/YYYY df_features['month/year'] = pd.to_datetime(df_features['month/year'], format='%m/%Y').dt.strftime('%m/%Y') df_target.columns = ['id'] + [pd.to_datetime(col, format='%m/%Y').dt.strftime('%m/%Y') for col in df_target.columns[1:]] - 批量处理月份列:如果你的因变量有很多月份列,不需要手动指定
value_vars,melt()会自动把除了id_vars之外的所有列转为值列。
内容的提问来源于stack exchange,提问作者business_of_ferrets
相关产品推荐
相关产品推荐

