我有一个包含['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
答案 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
使用.agg
,np.where
和size
:
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()