2017-11-17 131 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