我正在尝试以以下形式在数据框中实现新列:

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

08-25 08:09
查看更多