web-dev-qa-db-ja.com

Pandas groupbyおよび集約の出力には、元のすべての列(集約されていない列を含む)が含まれている必要があります)

次のデータフレームがあり、次のことを行います。

  • monthでレコードをグループ化する
  • 合計QTY_SOLDand NET_AMT一意の各UPC_ID(月ごと)
  • 結果のデータフレームに残りの列も含めます

私がこれを行うことができると思った方法は最初です:month列を作成してD_DATES、合計QTY_SOLD by UPC_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
...  

質問:

  • 各行の月を含めるにはどうすればよいですか?
  • データフレームの残りの列を含めるにはどうすればよいですか?
  • また、合計NET_AMT に加えて QTY_SOLD
12
Growler

aggdictの関数

関数の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

ブランケットsum

列名なしで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
14
cs95

私はこの長い時間を考えています、あなたの質問に感謝します私にそれを作るように押してください。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
4
WeNYoBen