我有以下数据框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
的{{1}}值都会被视为“主要”类型。如果{em>“/ bc”类型的/bc
值有多种组合,则< / em>和“main”类型,code
的聚合应该在每个组合上完成(对于eq行1,2,3和4有两种类型的组合“ main“和”/ bc“。请注意,特定amt
的{{1}}类型”/ bc“和“main”。完成order
的聚合后,我希望删除code
类型“/ bc”
如果特定order
和code
没有sale
类型“bc”,则“amt”的值应相同。对于eq,第5行和第6行应保持不变,order
,code
值应保持不变。
结果数据框code
理想情况下应为:
amt
第1行中的 df2
值为“1000 + 5”,第2行中的值为“600 + 11”{ 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
类型“main”已添加到相应的< EM> “/ BC”。第3行和第4行中的amt
值保持不变,第5行中的值为“1000 + 34”。
我知道这是很多信息,但我尽量保持一致。如果有任何问题我会请求,请发表评论。我会很感激的。任何形式的帮助总是受到欢迎:)
答案 0 :(得分:3)
你可以这样做:
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
答案 1 :(得分:2)
我分解了这些步骤......关键是建立一个列帮助以确定内部组
df1.code=df1.code.replace({'bc':np.nan},regex=True)
df1['New']=df1.code.isnull()
d1=df1.groupby([df1.sale,df1.order,df1.groupby(['sale','order','New']).cumcount()],as_index=False).amt.sum()
pd.concat([d1,df1.dropna().code.reset_index(drop=True)],1)
Out[344]:
sale order amt code
0 1 11 1005 mx212
1 1 11 611 rx321
2 1 12 800 sx234
3 1 12 1232 mx456
4 3 13 1034 mx322