группа за неделю в пандах

У меня есть этот фрейм данных:

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

заранее спасибо

Ответ 1

Сначала конвертируйте date столбца to_datetime и to_datetime одну неделю.

Затем используйте groupby с Grouper по W-MON и суммарную sum:

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

Ответ 2

Пусть использовать 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

Ответ 3

Сначала преобразуйте дату столбца to_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

Ответ 4

Я думаю, это намного проще, чем текущие ответы.

Создание df:

df = pd.DataFrame({
            'name' : ['apple', 'orange', 'apple', 'orange', 'apple'],
            'date' : pd.to_datetime([
                '7/10/17', '7/10/17', '7/10/17', '7/25/17', '7/20/17'
                ]),
            'quantity' : [20, 20, 70, 40, 30]
      })

Входные данные:

# Groupby 'date', then 'name'
# Grab the 'quantity' column from each group
# Take the sum of each 'quantity' column

df.groupby(['date', 'name'])['quantity'].sum()

Выход:

date        name  
2017-07-10  apple     90
            orange    20
2017-07-20  apple     30
2017-07-25  orange    40
Name: quantity, dtype: int64