基于 groupby() 计算多列数据的 pandas 函数是什么?

3
假设我们想要根据分组对列之间进行计算。
原始数据框架:
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分组的quantityitem_price获取结果,而不使用item_price_total? 我的想法是使用groupby(['order_id']).apply()lambda函数,但经过多次尝试,我仍然没有找到解决方案。


3
使用Series的groupby方法,可以直接写出以下代码来计算订单总价:df['order_price'] = df['quantity'].mul(df['item_price']).groupby(df['order_id']).transform('sum')该代码会根据订单ID对数据进行分组,然后将每个订单的商品数量和商品单价相乘得到商品总价,最后再将同一个订单中的所有商品总价求和,得到该订单的总价。 - anky
1
按照 anky 的建议去做。你可以使用 groupby + lambda 来实现,但是这样会慢很多。通常在使用 groupby 时,目标是尽量避免使用 lambda,而是使用内置方法(https://dev59.com/2Lzpa4cB1Zd3GeqPOZ5C#63307380),就像 anky 建议的那样,使用 sum - ALollz
1个回答

0

感谢 Anky 的想法,

你可以尝试这个:

result = pd.DataFrame(df['quantity'].mul(df['item_price'])
                                    .groupby(df['order_id'])
                                    .transform('sum'), columns=['order_price'])
                                    .join(df)
print(result)

#    order_price  order_id  quantity  item_price
# 0           32         1         1          10
# 1           32         1         3           6
# 2           32         1         1           4
# 3           11         2         1           5
# 4           11         2         2           3
# 5           12         3         2           6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接