啊啊啊啊啊吖

2019-03-14   阅读量: 722

数据分析师 Python数据分析

累计和时间段

扫码加入数据分析学习群

我的数据帧具有以下结构:

date_today = dt.datetime.now()

size=20

df = pd.DataFrame({"usd": pd.Series(np.random.randint(1,100,size))*10,

"sent": dt.datetime.now(),

"temp":np.random.randint(0,15, size=size)

})

df.sent += df.temp.map(dt.timedelta)

df.temp = np.random.randint(10,25, size=size)

df["reminder"] = df.sent + df.temp.map(dt.timedelta)

df.temp = np.random.randint(1,65, size=size)

df["completed"] = df.reminder + df.temp.map(dt.timedelta)

df.loc[df['temp']%3 == 0, ['reminder']] = [""]

df.loc[df['temp']%2 == 0, ['completed']] = [""]

df=df[["usd", "sent", "reminder", "completed"]]

usd是我要求的钱(数字),其他列是datetime(当我请求时,当我发送提醒时,当我拿到钱;最后两个可以为空)。我还创建了以下一个月的季度列表:

date_index = []

previous_date=""

for m in range(0,14):

month = (m%12)+1

year = m//12

current_date = dt.date(2019+year, month, 1)

if previous_date:

timedelta = current_date-previous_date

date_index.append(previous_date+1*timedelta/4)

date_index.append(previous_date+2*timedelta/4)

date_index.append(previous_date+3*timedelta/4)

date_index.append(current_date)

previous_date = current_date

我想获得一个具有以下结构的数据帧:

df_result = pd.DataFrame(columns=["date","sent_amount","reminder_amount","completed_amount"])

解决办法:可以melt将DataFrame,cut日期转换为日期范围date_index,然后按变量(已完成/提醒/已发送)+日期,sum向上usd金额的组合进行分组,然后将其重新堆叠回列中并cumsum获取累积总和:

x = df.melt('usd', value_name='date')

x['date'] = pd.cut(x['date'], pd.to_datetime(date_index)).apply(lambda x: x.right)

x['variable'] += '_amount'

df_result = x.dropna().groupby(['variable', 'date'])['usd'].sum().unstack(0, 0).sort_index().cumsum()

print(df_result)

8.5779 1 0 关注作者 收藏

评论(0)


暂无数据

推荐课程

推荐帖子