2017-11-17 2 views
1

私は、次のデータフレームを持っているとしたい含まれます:パンダグループによる - すべての列

  • グループレコードmonth
  • 合計QTY_SOLDとそれぞれの固有UPC_IDNET_AMTによって(月額)
  • を含めます残りの列も結果のデータフレームに表示されます

私はこれを行うことができると思った方法は第1です:カラムはD_DATESを集計し、次にQTY_SOLDUPC_IDと合計します。

スクリプト:

# 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 
を使用して.Byそれを作るために私を押して、この長い時間考えています
関連する問題