我正在尝试以以下形式在数据框中实现新列:
Client_id Product_a
1 1
1 2
1 1
1 0
2 1
2 0
2 3
2 1
所以...我要做的是三个新列(total_buy,total_sell和total_operations)。在这些新列中,我想计算每个client_id的购买,销售和操作总数。每个client_id至少出现一次,最多出现24次。
因此,我的输出应如下所示(对于上面显示的示例):
Client_id A_buy A_sell A_operations
1 2 2 4
2 4 3 7
我正在使用具有不同功能的groupby作为sum / mean / min / max,它们非常有用,但是现在我想尝试这种新方法。实际上,我大约有52k客户和12种不同的产品,但我不知道如何处理这项新任务。
我的数据框中的行总数约为60万,每个客户至少出现1次,最多出现24次(我有2年的数据)
有内置功能可以完成此任务吗?
有解决这个问题的建议吗?
感谢您的建议!
最佳答案
让我们尝试这样的事情:
df = pd.DataFrame({'Client_id':[1,1,1,1,2,2,2,2],'Product_a':[1,2,1,0,1,0,3,1]})
#Define action based on diff previous record fill first record with first value in group
df_out = df.assign(action=df.groupby('Client_id')['Product_a']\
.apply(lambda x: x.diff().fillna(x.iloc[0])))
#Classify buy or sell based of positive or negative action
df_out['buys'] = np.where(df_out.action.gt(0), df_out.action, 0)
df_out['sells'] = np.where(df_out.action.lt(0), df_out.action.mul(-1), 0)
#Lastly, groupby and sum records by client
df_out.groupby('Client_id')[['buys', 'sells']].sum().eval('operations = buys + sells')\
.add_prefix('A_').reset_index()
输出:
Client_id A_buys A_sells A_operations
0 1 2.0 2.0 4.0
1 2 4.0 3.0 7.0