基于多个条件在pandas数据帧中执行聚合和转换

时间:2017-11-03 03:59:56

标签: python pandas dataframe

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

这里,销售人员可以有多个订单,每个订单可以有多个代码。我想根据amtsaleorder的特定组合汇总和转换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”

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

结果数据框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”。

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

2 个答案:

答案 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