大熊猫一周一周

时间:2017-07-24 12:58:51

标签: python pandas

我有这个数据框:

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

提前致谢

4 个答案:

答案 0 :(得分:36)

首先转换列date to_datetime并减去一周。

然后使用groupbyGrouper W-MONsum汇总{<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)

让我们使用groupbyresample使用W-Monsum

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。从星期一开始,它将按周分组。它将输出星期数(但您可以更改

  

http://strftime.org/

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()