问题描述
我有每年粒度的示例数据框:
df = pd.DataFrame({
"date": ["2020-01-01","2021-01-01","2022-01-01"],"cost": [100,1000,150],"person": ["Tom","Jerry","Brian"]
})
我想在没有任何估计方法的情况下创建具有每月粒度的数据帧(每年只需重复一行 12 次。因此,在这个 3 行数据帧的结果中,我希望得到 36 行完全像:
2020-01-01 / 100 / Tom
2020-02-01 / 100 / Tom
2020-03-01 / 100 / Tom
2020-04-01 / 100 / Tom
2020-05-01 / 100 / Tom
[...]
2022-10-01 / 150 / Brian
2022-11-01 / 150 / Brian
2022-12-01 / 150 / Brian
我试过了
df.resample('M',on = 'date').apply(lambda x:x)
但似乎无法让它工作......
我是初学者,请原谅我的无知 提前感谢您的帮助!
解决方法
这是一种方法。
count = len(df)
for var in df[['date','cost','person']].values:
for i in range(2,13):
df.loc[count] = [(var[0][0:5] + "{:02d}".format(i) + var[0][7:]),var[1],var[2]]
count += 1
df = df.sort_values('date')
,
以下也应该有效,
#Typecasting
df['date'] = pd.to_datetime(df['date'])
#Making new dataframe based on frequency
op = pd.DataFrame(pd.date_range(start=df['date'].min(),end=df['date'].max()+pd.offsets.DateOffset(months=11),freq='MS'),columns = ['date'])
#merging both results on year using merge( with outer join)
res = pd.merge(df,op,left_on=df['date'].apply(lambda x: x.year),right_on = op['date'].apply(lambda x: x.year),how = 'outer')
#dropping key columns from left side
res.drop(['key_0','date_x'],axis=1,inplace=True)