我有这个数据框:
Name Date Quantity
Apple 07/11/17 20
orange 07/14/17 20
Apple 07/14/17 70
Orange 07/25/17 40
Apple 07/20/17 30
我希望通过名称和日期对此进行汇总,以获得数量总和 详细说明:
日期:分组,结果应该是一周的开头(或者只是星期一)
数量:总和,如果两个或多个记录具有相同的名称和日期(如果是相同的间隔)
下面给出了所需的输出:
Name Date Quantity
Apple 07/10/17 90
orange 07/10/17 20
Apple 07/17/17 30
orange 07/24/17 40
提前致谢
答案 0 :(得分:36)
首先转换列date
to_datetime
并减去一周。
然后使用groupby
与Grouper
W-MON并sum
汇总{<1}}:
df['Date'] = pd.to_datetime(df['Date']) - pd.to_timedelta(7, unit='d')
df = df.groupby(['Name', pd.Grouper(key='Date', freq='W-MON')])['Quantity']
.sum()
.reset_index()
.sort_values('Date')
print (df)
Name Date Quantity
0 Apple 2017-07-10 90
3 orange 2017-07-10 20
1 Apple 2017-07-17 30
2 Orange 2017-07-24 40
答案 1 :(得分:7)
让我们使用groupby
,resample
使用W-Mon
和sum
:
df.groupby('Name').resample('W-Mon', on='Date').sum().reset_index().sort_values(by='Date')
输出:
Name Date Quantity
0 Apple 2017-07-17 90
3 orange 2017-07-17 20
1 Apple 2017-07-24 30
2 Orange 2017-07-31 40
答案 2 :(得分:1)
首先将列日期转换为_datetime。从星期一开始,它将按周分组。它将输出星期数(但您可以更改
df.groupby(['name', df['date'].dt.strftime('%W')])['quantity'].sum()
输出:
name date
apple 28 90
29 30
orange 28 20
30 40
答案 3 :(得分:0)
这会将上一个星期一的每一行分组(如果日期已经是星期一,则什么都不会更改)。这具有按周分组的效果:
this.router.navigate([`/administration/contacts/list/${row.contact_id}`])
示例:
import pandas as pd, datetime as dt
# df = ...
df['WeekDate'] = df.apply(lambda row: row['Date'] - dt.timedelta(days=row['Date'].weekday()), axis=1)
perweek = df['WeekDate'].groupby(df['WeekDate']).count()