作者:手机用户2602881417 | 来源:互联网 | 2023-10-09 19:41
这是我的数据
df = pd.DataFrame([
{start_date: '2019/12/01',end_date: '2019/12/05',spend: 10000,campaign_id: 1}
{start_date: '2019/12/05',end_date: '2019/12/09',spend: 50000,campaign_id: 2}
{start_date: '2019/12/01',end_date: '',campaign_id: 3}
{start_date: '2019/12/01',end_date: '2019/12/01',spend: 50,campaign_id: 4}
]);
自2019年12月1日起,我需要在每一行的每一行中添加一列,并计算该天该广告系列的支出,这是通过将广告系列的支出除以总天数得出的它很活跃。
因此,我将在12月1日至今天(12月10日)之间的每一天添加一列。对于第1行,12月1日至12月5日这5列的内容为2000,然后,对于12月5日至12月10日的6个列,其内容为零。
我知道熊猫是针对此类问题精心设计的,但我不知道从哪里开始!
对我来说,这似乎不是直接的任务。但是,如果尚未转换日期列,请先进行转换:
df["start_date"] = pd.to_datetime(df["start_date"])
df["end_date"] = pd.to_datetime(df["end_date"])
然后创建一个用于重采样的辅助函数:
def resampler(data,daterange):
temp = (data.set_index('start_date').groupby('campaign_id')
.apply(daterange)
.drop("campaign_id",axis=1)
.reset_index().rename(columns={"level_1":"start_date"}))
return temp
现在是一个三步过程。首先根据每个组的end_date
对数据进行重新采样:
df1 = resampler(df,lambda d: d.reindex(pd.date_range(min(d.index),max(d["end_date"]),freq="D")) if d["end_date"].notnull().all() else d)
df1["spend"] = df1.groupby("campaign_id")["spend"].transform(lambda x: x.mean()/len(x))
计算出平均值之后,resample
再次显示当前日期:
dates = pd.date_range(min(df["start_date"]),pd.Timestamp.today(),freq="D")
df1 = resampler(df1,lambda d: d.reindex(dates))
最后转置您的数据框:
df1 = pd.concat([df1.drop("end_date",axis=1).set_index(["campaign_id","start_date"]).unstack(),df1.groupby("campaign_id")["end_date"].min()],axis=1)
df1.columns = [*dates,"end_date"]
print (df1)
#
2019-12-01 00:00:00 2019-12-02 00:00:00 2019-12-03 00:00:00 2019-12-04 00:00:00 2019-12-05 00:00:00 2019-12-06 00:00:00 2019-12-07 00:00:00 2019-12-08 00:00:00 2019-12-09 00:00:00 2019-12-10 00:00:00 end_date
campaign_id
1 2000.0 2000.0 2000.0 2000.0 2000.0 NaN NaN NaN NaN NaN 2019-12-05
2 NaN NaN NaN NaN 10000.0 10000.0 10000.0 10000.0 10000.0 NaN 2019-12-09
3 10000.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaT
4 50.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2019-12-01