假设我们想要根据分组对列之间进行计算。
原始数据框架:
我想要计算每个订单的总价格,格式应为:
我通过添加新的列
原始数据框架:
data = {'order_id': [1, 1, 1, 2, 2, 3],
'quantity': [1, 3, 1, 1, 2, 2],
'item_price': [10, 6, 4, 5, 3, 6],}
df = pd.DataFrame(data, columns=['order_id', 'quantity', 'item_price'])
order_id | quantity | item_price
1 1 10
1 3 6
1 1 4
2 1 5
2 2 3
3 2 6
我想要计算每个订单的总价格,格式应为:
order_id | quantity | item_price | order_price
1 1 10 32
1 3 6 32
1 1 4 32
2 1 5 11
2 2 3 11
3 2 6 12
我通过添加新的列
item_price_total
来实现这个功能。df['item_price_total'] = df['quantity'] * df['item_price']
可以使用 groupby(['order_id'])['item_price_total'].transform('sum')
:
order_id | quantity | item_price | item_price_total | order_price
1 1 10 10 32
1 3 6 18 32
1 1 4 4 32
2 1 5 5 11
2 2 3 6 11
3 2 6 12 12
我的问题是如何直接从按order_id
分组的quantity
和item_price
获取结果,而不使用item_price_total
? 我的想法是使用groupby(['order_id']).apply()
与lambda
函数,但经过多次尝试,我仍然没有找到解决方案。
df['order_price'] = df['quantity'].mul(df['item_price']).groupby(df['order_id']).transform('sum')
该代码会根据订单ID对数据进行分组,然后将每个订单的商品数量和商品单价相乘得到商品总价,最后再将同一个订单中的所有商品总价求和,得到该订单的总价。 - ankygroupby
+lambda
来实现,但是这样会慢很多。通常在使用 groupby 时,目标是尽量避免使用lambda
,而是使用内置方法(https://dev59.com/2Lzpa4cB1Zd3GeqPOZ5C#63307380),就像 anky 建议的那样,使用sum
。 - ALollz