2017-07-24 34 views
6

Tôi đang gặp khung dữ liệu này:nhóm theo tuần trong gấu trúc

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 

tôi muốn tổng hợp này theo tên và ngày để có được tổng số lượng chi tiết:

ngày: Group, kết quả sẽ là vào đầu tuần (hoặc chỉ vào Thứ Hai)

Số lượng: Tổng, nếu hai hoặc nhiều bản ghi có cùng Tên và Ngày (nếu rơi trên cùng khoảng thời gian)

Các đầu ra mong muốn được đưa ra dưới đây:

Name Date Quantity 
Apple 07/10/17 90 
orange 07/10/17 20 
Apple 07/17/17 30 
orange 07/24/17 40 

Cảm ơn trước

Trả lời

11

Cột chuyển đổi đầu tiên dateto_datetime và trừ đi một tuần.

Sau đó sử dụng groupby với Grouper bởi W-MON và tổng hợp 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 
+0

Cảm ơn bạn đã trả lời! Nhưng khi tôi sử dụng mã của bạn, nó sẽ hiển thị, ** TypeError: Chỉ hợp lệ với DatetimeIndex, TimedeltaIndex hoặc PeriodIndex, nhưng có một ví dụ về 'Index' ** Bạn có biết tại sao không? Cảm ơn – Ram

+0

Có, nhưng nó đang hiển thị một lỗi như đã đề cập ở trên – Ram

+0

Xin lỗi ... Nhưng đây không phải là những gì tôi muốn. – Ram

2

Hãy sử dụng groupby, resample với W-Mon, và sum:

df.groupby('Name').resample('W-Mon', on='Date').sum().reset_index().sort_values(by='Date') 

Output:

 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

Cảm ơn bạn đã trả lời .Nhưng khi tôi sử dụng mã của bạn nó được hiển thị, ** TypeError : Chỉ hợp lệ với DatetimeIndex, TimedeltaIndex hoặc PeriodIndex, nhưng có một ví dụ về 'Index' ** Bạn có biết tại sao không? Cảm ơn – Ram

+0

Có, bạn cần chuyển đổi cột dữ liệu 'thành datetime dtype. Sử dụng df ['Date'] = pd.to_datetime (df ['Date']). –

0

Tôi nghĩ rằng đó là dễ dàng hơn nhiều so với câu trả lời hiện tại.

Làm 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] 
     }) 

Input:

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

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

Output:

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

Tôi nghĩ rằng bạn đã bỏ lỡ phần về nhóm theo tuần, tức là 2017-07-20 và 2017-07-21 phải ở trong cùng một nhóm – matusko

Các vấn đề liên quan