我有一个数据框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})
但它不会帮助我
答案 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