2017-07-24 97 views
6

我有这个数据帧:组由周大熊猫

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 

预先感谢

回答

11

首先将列dateto_datetime转换并减去一周。

然后通过W-MON和汇总sum使用groupbyGrouper

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 
+0

感谢您的回复!但是当我使用您的代码时,它显示** TypeError:只对DatetimeIndex,TimedeltaIndex或PeriodIndex有效,但获得了'Index'的实例**您知道为什么吗?谢谢 – Ram

+0

是的,但它显示如上所述的错误 – Ram

+0

对不起...但这不是我想要的。 – Ram

2

让我们用groupbyresampleW-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 
+0

感谢您的答复。可是当我用你的代码,它显示,**类型错误:只对DatetimeIndex,TimedeltaIndex或PeriodIndex有效,但得到'Index'的实例**你知道为什么吗?谢谢 – Ram

+0

是的,你需要将'data'列转换为dtype datetime。使用df ['Date'] = pd.to_datetime(df ['Date'])。 –

0

我觉得它比目前的答案要容易得多。

制作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 
+0

我想你错过了关于按周分组的部分,即2017-07-20和2017-07-21应该在同一组中 – matusko