我有如下所示的df:
|User | Date | Items|
|-----|-----------|------|
|x | 2021/03/01| 3 |
|x | 2021/03/09| 5 |
|y | 2021/03/09| 11 |
|z | 2021/03/17| 7 |我想总结如下:
|User | Week 1| Week 2| Week 3| Total|
|-----|-------|-------|-------|------|
|x | 3 | 5 | 0 | 8 |
|y | 0 | 11 | 0 | 11 |
|z | 0 | 0 | 7 | 7 |我做这件事最好的方法是什么?
抱歉,如果我格式化错误,我对此非常陌生-非常感谢
发布于 2022-08-23 11:24:56
假设你的一周是根据天数计算的:
(df.assign(wom=pd.to_datetime(df['Date']).dt.day.floordiv(7).add(1))
.pivot_table(index='User', columns='wom', values='Items',
aggfunc='sum', fill_value=0, margins='columns')
.add_prefix('Week ').rename(columns={'Week All': 'Total'})
.iloc[:-1].reset_index().rename_axis(columns=None)
)产出:
User Week 1 Week 2 Week 3 Total
0 x 3 5 0 8
1 y 0 11 0 11
2 z 0 0 7 7发布于 2022-08-23 11:19:50
代码:
我从某个地方复制了这份乐趣
def week_number_of_month(date_value):
return 'Week ' + str((date_value.isocalendar()[1] - date_value.replace(day=1).isocalendar()[1] + 1))
for idx, val in enumerate(df['Date']):
df.loc[idx, 'Date'] = week_number_of_month(pd.to_datetime(val))使用枢轴表,将列值转换为列
df = df.pivot_table(values='Iteams', index=df.User, columns='Date', aggfunc='first').fillna(0)
df['Total'] = df[df.columns].sum(axis=1)
df输出:
Date Week 1 Week 2 Week 3 Total
User
x 3.0 5.0 0.0 8.0
y 0.0 11.0 0.0 11.0
z 0.0 0.0 7.0 7.0发布于 2022-08-23 11:29:25
你可以试着计算一个月中的一个星期,然后再转一周。
df.Date = pd.to_datetime(df.Date)
df['week'] = df.Date.dt.day//7+1
out = df[['User','Items','week']].pivot('User','week').fillna(0)
out = out.assign(total=out.sum(axis=1))输出:
Items total
week 1 2 3
User
x 3.0 5.0 0.0 8.0
y 0.0 11.0 0.0 11.0
z 0.0 0.0 7.0 7.0https://stackoverflow.com/questions/73457286
复制相似问题