如何用Pandas为每行时序数据生成多Unit的合成测试数据
如何为时序DataFrame生成多Unit的合成数据?
问题场景
构建机器学习模型时需要生成测试用的合成时序数据,现有DataFrame如下:
Date DayOfWeek Unit 2022-10-01 7 A 2022-10-02 1 A 2022-10-03 2 A
需要保留每行的Date和DayOfWeek并重复,同时为每个Unit(A、B、C、D)生成对应行,最终得到如下格式的数据:
Date DayOfWeek Unit 2022-10-01 7 A 2022-10-01 7 B 2022-10-01 7 C 2022-10-01 7 D 2022-10-02 1 A 2022-10-02 1 B 2022-10-02 1 C 2022-10-02 1 D 2022-10-03 2 A 2022-10-03 2 B 2022-10-03 2 C 2022-10-03 2 D
之前尝试用df.reindex(df.index.repeat(4)).reset_index(drop=True)重复行,但会把Unit列的A也重复,需要修改实现目标。
解决方法
方法1:基于现有repeat方法修改
先按原逻辑重复行,然后用np.tile生成循环的Unit值替换原列:
import pandas as pd import numpy as np # 假设原DataFrame为df df_repeated = df.reindex(df.index.repeat(4)).reset_index(drop=True) # 为Unit列填充A-D循环值 df_repeated['Unit'] = np.tile(['A', 'B', 'C', 'D'], len(df))
方法2:笛卡尔积合并(更简洁高效)
生成包含所有Unit的DataFrame,再与原数据去掉Unit列后做交叉合并,直接生成所有组合:
import pandas as pd # 生成Unit列表的DataFrame units_df = pd.DataFrame({'Unit': ['A', 'B', 'C', 'D']}) # 交叉合并生成所有Date+DayOfWeek与Unit的组合 result = df.drop('Unit', axis=1).merge(units_df, how='cross')
两种方法都能得到目标结果,方法2更符合pandas的惯用逻辑,也避免了重复后替换列的步骤。
内容的提问来源于stack exchange,提问作者Ragnar Lothbrok
相关产品推荐
相关产品推荐

