在熊猫中乘以常数进行求和

时间:2017-09-15 11:19:21

标签: pandas

我有一个数据框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 * count(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})

但它不会帮助我

1 个答案:

答案 0 :(得分: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