2017-11-17 152 views
1

我有以下的數據幀,並想:熊貓集團 - 包括所有列

  • 組記錄由month
  • 總和QTY_SOLD和各UPC_ID(每月)獨特的NET_AMT
  • 附上其餘的列以及產生的數據幀

我認爲我可以做到這一點的方式是第1種:創建month列彙總D_DATES,然後通過UPC_ID彙總QTY_SOLD

腳本:

# Convert date to date time object 
df['D_DATE'] = pd.to_datetime(df['D_DATE']) 

# Create aggregated months column 
df['month'] = df['D_DATE'].apply(dt.date.strftime, args=('%Y.%m',)) 

# Group by month and sum up quantity sold by UPC_ID 
df = df.groupby(['month', 'UPC_ID'])['QTY_SOLD'].sum() 

當前數據幀:

UPC_ID | UPC_DSC | D_DATE | QTY_SOLD | NET_AMT 
---------------------------------------------- 
111  desc1 2/26/2017 2   10 (2 x $5) 
222  desc2 2/26/2017 3   15 
333  desc3 2/26/2017 1   4 
111  desc1 3/1/2017 1   5 
111  desc1 3/3/2017 4   20 

所需的輸出:

MONTH | UPC_ID | QTY_SOLD | NET_AMT | UPC_DSC 
---------------------------------------------- 
2017-2  111  2   10  etc... 
2017-2  222  3   15 
2017-2  333  1   4 
2017-3  111  5   25 

實際輸出:

MONTH | UPC_ID 
---------------------------------------------- 
2017-2  111  2 
      222  3 
      333  1 
2017-3  111  5 
... 

問題:

  • 怎樣包括每一行的一個月?
  • 如何包含數據框的其餘列?
  • 除了QTY_SOLD之外,怎麼樣還總結NET_AMT

回答

3

選項1
創建的功能的dict並將它傳遞給agg。您還需要as_index=False以防止組列成爲輸出中的索引。

f = {'NET_AMT': 'sum', 'QTY_SOLD': 'sum', 'UPC_DSC': 'first'} 
df.groupby(['month', 'UPC_ID'], as_index=False).agg(f) 

    month UPC_ID UPC_DSC NET_AMT QTY_SOLD 
0 2017.02  111 desc1  10   2 
1 2017.02  222 desc2  15   3 
2 2017.02  333 desc3  4   1 
3 2017.03  111 desc1  25   5 

選項2
只需撥打sum沒有任何列名。這處理數字列。對於UPC_DSC,您需要單獨處理。

g = df.groupby(['month', 'UPC_ID']) 
i = g.sum() 
j = g[['UPC_DSC']].first() 

pd.concat([i, j], 1).reset_index() 

    month UPC_ID QTY_SOLD NET_AMT UPC_DSC 
0 2017.02  111   2  10 desc1 
1 2017.02  222   3  15 desc2 
2 2017.02  333   1  4 desc3 
3 2017.03  111   5  25 desc1 
2

我想這個很久了,謝謝你的問題推我讓。通過使用aggif...else

df.groupby(['month', 'UPC_ID'],as_index=False).agg(lambda x : x.sum() if x.dtype=='int64' else x.head(1)) 
Out[1221]: 
    month UPC_ID UPC_DSC  D_DATE QTY_SOLD NET_AMT 
0  2  111 desc1 2017-02-26   2  10 
1  2  222 desc2 2017-02-26   3  15 
2  2  333 desc3 2017-02-26   1  4 
3  3  111 desc1 2017-03-01   5  25