熊猫的动态总和

时间:2017-05-09 18:50:48

标签: python pandas dataframe

我有一个包含['customer_id','date','item_code'和'amount']的杂货交易的pandas数据框。

我想将同一天的多个交易分组到一个交易中,并将这些交易的总和。例如,如果我在1-1-16上购买3件商品,每件5美元,10美元和15美元,我希望将其表示为单行,价值为30美元。

那部分是一个简单的groupby

df.groupby(['customer_id', 'date'])['amount'].sum()

我的问题是我要创建一个名为“transaction_type”的新列,如果该行已分组 ,则将代码('grpd')分配给行 ,以及item_code的相应值 如果没有分组

因此,如果我在1-1-16上购买了3件商品,但在1-2-16上购买了一件新商品,我希望我的customer_id在数据框中显示2行。一个用于1-1-16,在新的transaction_type列中具有自定义'grpd'值,一个用于1-2-16,其中来自item_code列的原始值被复制到transaction_type列中。所以我的数据框最终会对我的交易看起来像这样:

customer_id     date    transaction_type   amount
  4231         1-1-16        grpd           $30
  4231         1-2-16        candy          $5

2 个答案:

答案 0 :(得分:3)

创建虚拟数据:

df = pd.DataFrame({'customer_id':['4231']*4,'date':['1-1-2016','1-1-2016','1-1-2016','1-2-2016'],'items':['gum','candy','soda','candy'],'amount':[9,11,10,5]})

输入:

   amount customer_id      date  items
0       9        4231  1-1-2016    gum
1      11        4231  1-1-2016  candy
2      10        4231  1-1-2016   soda
3       5        4231  1-2-2016  candy

使用.aggnp.wheresize

df_out = (df.groupby(['customer_id','date'])
    .agg({'items': lambda x: np.where(x.size > 1,'grpd',x.min()),'amount':'sum'})
    .reset_index()
    .rename(columns={'items':"transaction_type"}))

输出:

  customer_id      date  amount transaction_type
0        4231  1-1-2016      30             grpd
1        4231  1-2-2016       5            candy

答案 1 :(得分:1)

您也可以transaction_type分组:

df.groupby(['date', 'customer_id', 'transaction_type'])['amount'].sum()