我有以下数据框 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
