为每周的结束分配一列 stack ,在使用之前的 groupby 尝试:
stack
groupby
(df.assign(end=df['wk start'].add(pd.DateOffset(6))).set_index( ['car', 'sales']).stack() .rename('wk start').reset_index([0, 1]) .set_index('wk start').groupby('car') .resample('D').pad() )
输出:
car sales car wk start tesla model 3 2018-08-12 tesla model 3 38000 2018-08-13 tesla model 3 38000 2018-08-14 tesla model 3 38000 2018-08-15 tesla model 3 38000 2018-08-16 tesla model 3 38000 2018-08-17 tesla model 3 38000 2018-08-18 tesla model 3 38000 2018-08-19 tesla model 3 40000 2018-08-20 tesla model 3 40000 2018-08-21 tesla model 3 40000 2018-08-22 tesla model 3 40000 2018-08-23 tesla model 3 40000 2018-08-24 tesla model 3 40000 2018-08-25 tesla model 3 40000 tesla model x 2018-08-12 tesla model x 98000 2018-08-13 tesla model x 98000 2018-08-14 tesla model x 98000 2018-08-15 tesla model x 98000 2018-08-16 tesla model x 98000 2018-08-17 tesla model x 98000 2018-08-18 tesla model x 98000
你也可以这样做:
(pd.melt(df.assign(w = df['wk start']+pd.DateOffset(6)),df.columns[1:],value_name = "wk start").drop('variable',1).set_index('wk start').groupby('car').resample('D').pad()) car sales car wk start tesla model 3 2018-08-12 tesla model 3 38000 2018-08-13 tesla model 3 38000 2018-08-14 tesla model 3 38000 2018-08-15 tesla model 3 38000 2018-08-16 tesla model 3 38000 2018-08-17 tesla model 3 38000 2018-08-18 tesla model 3 38000 2018-08-19 tesla model 3 40000 2018-08-20 tesla model 3 40000 2018-08-21 tesla model 3 40000 2018-08-22 tesla model 3 40000 2018-08-23 tesla model 3 40000 2018-08-24 tesla model 3 40000 2018-08-25 tesla model 3 40000 tesla model x 2018-08-12 tesla model x 98000 2018-08-13 tesla model x 98000 2018-08-14 tesla model x 98000 2018-08-15 tesla model x 98000 2018-08-16 tesla model x 98000 2018-08-17 tesla model x 98000 2018-08-18 tesla model x 98000
是的,你是对的,排除了最后的边缘数据。解决方案是将它们添加到输入 DataFrame - 我的解决方案创建了一个帮手 Dataframe 运用 drop_duplicates ,补充道 6 天和 concat 是原创的 df 在使用解决方案之前:
DataFrame
Dataframe
drop_duplicates
6
concat
df
df1 = df.sort_values('wk start').drop_duplicates('car', keep='last').copy() df1['wk start'] = df1['wk start'] + pd.Timedelta(6, unit='d') df = pd.concat([df, df1], ignore_index=True) df = df.set_index('wk start').groupby('car').resample('D').pad() print (df) car sales car wk start tesla model 3 2018-08-12 tesla model 3 38000 2018-08-13 tesla model 3 38000 2018-08-14 tesla model 3 38000 2018-08-15 tesla model 3 38000 2018-08-16 tesla model 3 38000 2018-08-17 tesla model 3 38000 2018-08-18 tesla model 3 38000 2018-08-19 tesla model 3 40000 2018-08-20 tesla model 3 40000 2018-08-21 tesla model 3 40000 2018-08-22 tesla model 3 40000 2018-08-23 tesla model 3 40000 2018-08-24 tesla model 3 40000 2018-08-25 tesla model 3 40000 tesla model x 2018-08-12 tesla model x 98000 2018-08-13 tesla model x 98000 2018-08-14 tesla model x 98000 2018-08-15 tesla model x 98000 2018-08-16 tesla model x 98000 2018-08-17 tesla model x 98000 2018-08-18 tesla model x 98000