2017-09-15 26 views
0

我有一個數據幀df總結一組在與大熊貓乘以常數

id value text route distance 
1  100 asf  a1 10 
2  200 sdf  a1 30 
3  345 efs  a2 40 
4  232 asd  a2 60 
5  565 yjy  a2 70 

我正在尋找的是由路由分組和總結距離欄和值列,但增加+ 20 *計數( ID)爲每個路線。

for route a1 sum(Value) is 300 + 20*(count of id in group a1) 

我最後的DF應該像

route value distance 
a1  340  40  #300+(2*20) since count is 2 in group a1 
a2  1202  170 #1142+(3*20) since count is 2 in group a2 

我可以使用聚合得到正常組和總和,

x=final_df_results.groupby(['route']).agg({'distance':sum,'value': sum}) 

,但它不會幫我

+0

@jezrael謝謝 – Shubham

回答

2

0)由於ID計數將在相同的value計數,您可以使用自定義lambda函數

In [175]: (df.groupby('route',as_index=False) 
      .agg({'distance': 'sum', 'value': lambda x: x.sum() + len(x)*20})) 
Out[175]: 
    route distance value 
0 a1  40 340 
1 a2  170 1202 

1)使用assign你可以寫一個僞一行代碼

In [166]: (df.groupby('route', as_index=False) 
      .agg({'distance': 'sum', 'value': 'sum', 'id': 'size'}) 
      .assign(value=lambda x: x.value + 20*x.id) 
      .drop('id', 1)) 
Out[166]: 
    route distance value 
0 a1  40 340 
1 a2  170 1202 

2)或者,分配中間輸出

In [167]: dff = (df.groupby('route', as_index=False) 
        .agg({'distance': 'sum', 'value': 'sum', 'id': 'size'})) 

In [169]: dff['value'] = dff['value'] + 20*dff['id'] 

In [170]: dff 
Out[170]: 
    route distance id value 
0 a1  40 2 340 
1 a2  170 3 1202 

id列,如果你需要

In [171]: dff.drop('id', axis=1) 
Out[171]: 
    route distance value 
0 a1  40 340 
1 a2  170 1202