Skip to main content
 首页 » 编程设计

python之基于多种条件在pandas dataframe中进行聚合和转换

2025年05月04日20虾米哥

我有以下数据框 df1 。

import pandas as pd 
 
df1=pd.DataFrame([[1,11,'mx212', 1000], [1,11,'rx321', 600],  
                 [1,11,'/bc1', 5],[1,11,'/bc2', 11], [1,12,'sx234', 800], 
                 [1,12,'mx456', 1232], [3,13,'mx322', 1000], [3,13,'/bc3', 34]],  
                 columns=["sale","order","code","amt"]) 
 
   sale  order  code   amt 
0   1    11     mx212  1000 
1   1    11     rx321  600 
2   1    11     /bc1    5 
3   1    11     /bc2    11 
4   1    12     sx234   800 
5   1    12     mx456   1232 
6   3    13     mx322   1000 
7   3    13     /bc3    34 

在这里,一个销售人员可以有多个订单,每个订单可以有多个代码。我想根据 amt 、 sale 和 order 的特定组合来聚合和转换 code 。以 "/bc" 开头的 code 需要与主 code 值(“以 'mx'、'rx' 等值开头)聚合。请注意,任何 code 值不以/bc 被认为是类型“main”。如果 "/bc" 类型和 "main" 类型的 code 值有多种组合,amt 的聚合应该在每个组合上完成(因为 eq 行 1、2、3 和 4 有两种类型的组合 "main" 和 "/bc"。请注意,一个特定的order 将具有 code 类型 "/bc" 和 "main" 的相等值。完成 order 的聚合后,我想要 code 类型 "/bc" 被丢弃。

如果特定的 sale 和 order 没有 code 类型“bc”,则“amt”的值应该相同。对于 eq,第 5 行和第 6 行应保持不变,并且 code 和 amt 值应保持不变。

生成的数据帧 df2 理想情况下应该是这样的:

    sale  order  code   amt 
 0   1    11     mx212  1005 
 1   1    11     rx321   611 
 2   1    12     sx234   800 
 3   1    12     mx456   1232 
 4   3    13     mx322   1034 

第 1 行中的 amt 值为“1000+5”,第 2 行中的值为“600+11”{ code 类型 “main” 添加到相应的 “/bc”。第 3 行和第 4 行中的 amt 值保持不变,第 5 行中的值为“1000+34”。

我知道这是很多信息,但我尽量保持连贯。我会请求如果有任何问题,请发表评论。我会很感激的。随时欢迎任何形式的帮助:)

请您参考如下方法:

你可以这样做:

g=df1.groupby(['sale','order',df1.code.str.startswith('/bc')]).cumcount() 
 
df1.groupby(['sale','order',g],as_index=False)['amt','code']\ 
   .agg({'code':'first','amt':'sum'}) 

输出:

   sale  order   code   amt 
0     1     11  mx212  1005 
1     1     11  rx321   611 
2     1     12  sx234   800 
3     1     12  mx456  1232 
4     3     13  mx322  1034