Python 熊猫按三列分组,但保留所有其他列

Python 熊猫按三列分组,但保留所有其他列,python,pandas,dataframe,Python,Pandas,Dataframe,我有这样的数据框: offer_id affiliate_id affiliate_source affiliate_sub5 advertiser_id Payout_cent Revenue_cents 428572 1327 14331605 14331605 291 50 30 428572 1327 1465 1465

我有这样的数据框:

offer_id  affiliate_id affiliate_source affiliate_sub5  advertiser_id Payout_cent Revenue_cents
 428572          1327         14331605       14331605            291    50             30
 428572          1327             1465           1465            291    50             30
 428572          1327             1336           1336            291    50             30
 428572          1327         14331605       14331605            291    50             30
 428572          1327         14331605       14331605            291    50             30
我将三个栏目分为“提供id”、“附属id”、“附属来源”

操作:

df1.groupby(['offer_id', 'affiliate_id', 'affiliate_source'])[["payout_cents", "revenue_cents"]].sum()
结果:

offer_id affiliate_id affiliate_source                      payout_cents    revenue_cents
428572   1327         14331605                               90            150
                      1465                                   30            50
                      1336                                   30            50
问题: 在集团运营后,我需要获得其他栏目,如“广告客户id”和“附属机构sub5”。

谢谢。

我想您需要:

另一个解决方案包括:


然后在
groupby()
中使用它们:


总的来说,可能会有几个(不同的)广告客户id。你想要哪一个?如果它们都相同,您可以将它们添加到分组列中。是的,它们是不同的。所以我也需要根据广告商id进行分组?不,如果它们不同,你要么为每个组选择一个(第一个,最小的一个等),要么你可以按照jezrael的方法生成一个与原始数据帧长度相同的数据帧。好问题!:)我想按三列分组,而不是按所有列分组。
cols = ['offer_id', 'affiliate_id', 'affiliate_source']
df2 = df1.groupby(cols)[["payout_cents", "revenue_cents"]].sum().add_suffix('_sum')
df = df1.join(df2, on=cols)

print (df)
   offer_id  affiliate_id  affiliate_source  affiliate_sub5  advertiser_id  \
0    428572          1327          14331605        14331605            291   
1    428572          1327              1465            1465            291   
2    428572          1327              1336            1336            291   
3    428572          1327          14331605        14331605            291   
4    428572          1327          14331605        14331605            291   

   payout_cents  revenue_cents  payout_cents_sum  revenue_cents_sum  
0            50             30               150                 90  
1            50             30                50                 30  
2            50             30                50                 30  
3            50             30               150                 90  
4            50             30               150                 90  
cols = ['offer_id', 'affiliate_id', 'affiliate_source']
cols1 = ["payout_cents", "revenue_cents"]

df1[['{}_sum'.format(x) for x in cols1]] = df1.groupby(cols)[cols1].transform('sum')
df1.groupby(['offer_id', 'affiliate_id', 'affiliate_source', 'advertiser_id', 'affiliate_sub5'])[["payout_cents", "revenue_cents"]].sum()