Python-在多个Groupby上执行Max函数
我在下面有一个数据框,显示了来自两个不同供应商的木材和钢材的价格 我想添加一列,显示来自同一供应商的相对项目的最高价格(即,如果生产线是木材,它将拉动钢材) 例如,“汤姆”的“钢”行将显示他的最高木材价格,即42 到目前为止,我的代码只是返回原始项目的最高价格(即,不是相反,因此对于Tom的steel row,返回24,但我希望它返回42) 我认为这是一个为多组抽取最大值的问题。我尝试了很多不同的方法,但似乎都没有成功 任何想法都将不胜感激Python-在多个Groupby上执行Max函数,python,pandas,numpy,pandas-groupby,Python,Pandas,Numpy,Pandas Groupby,我在下面有一个数据框,显示了来自两个不同供应商的木材和钢材的价格 我想添加一列,显示来自同一供应商的相对项目的最高价格(即,如果生产线是木材,它将拉动钢材) 例如,“汤姆”的“钢”行将显示他的最高木材价格,即42 到目前为止,我的代码只是返回原始项目的最高价格(即,不是相反,因此对于Tom的steel row,返回24,但我希望它返回42) 我认为这是一个为多组抽取最大值的问题。我尝试了很多不同的方法,但似乎都没有成功 任何想法都将不胜感激 import pandas as pd import
import pandas as pd
import numpy as np
data = {'Supplier':['Tom', 'Tom', 'Tom', 'Bill','Bill','Bill'],'Item':['Wood','Wood','Steel','Steel','Steel','Wood'],'Price':[42,33,24,16,12,18]}
df = pd.DataFrame(data)
df['Opp_Item'] = np.where(df['Item']=="Wood", "Steel", "Wood")
df['Opp_Item_Max'] = df.groupby(['Supplier','Opp_Item'])['Price'].transform(max)
print(df)
Supplier Item Price Opp_Item Opp_Item_Max
0 Tom Wood 42 Steel 42
1 Tom Wood 33 Steel 42
2 Tom Steel 24 Wood 24
3 Bill Steel 16 Wood 16
4 Bill Steel 12 Wood 16
5 Bill Wood 18 Steel 18
如果您可以找到每个供应商+项目的最大值,那么您可以交换这些值,并通过
连接将其分配回:
v = df.groupby(['Supplier', 'Item']).Price.max().unstack(-1)
# This reversal operation works under the assumption that
# there are only two items and that they are opposites of each other.
v[:] = v.values[:, ::-1]
df = (df.set_index(['Supplier', 'Item'])
.join(v.stack().to_frame('Opp_Item_Max'), how='left')
.reset_index())
print(df)
Supplier Item Price Opp_Item_Max
0 Bill Steel 16 18
1 Bill Steel 12 18
2 Bill Wood 18 16
3 Tom Steel 24 42
4 Tom Wood 42 24
5 Tom Wood 33 24
注意:加入后,数据的顺序将不会保留。您可以将映射到groupby之前的相反值,然后将其合并回原始数据帧
d = {'Steel': 'Wood', 'Wood': 'Steel'}
df.merge(df.assign(Item = df.Item.map(d))
.groupby(['Supplier', 'Item'], as_index=False).max(),
on=['Supplier', 'Item'],
how='left',
suffixes=['', '_Opp_Item'])
Supplier Item Price Price_Opp_Item
0 Tom Wood 42 24
1 Tom Wood 33 24
2 Tom Steel 24 42
3 Bill Steel 16 18
4 Bill Steel 12 18
5 Bill Wood 18 16
谢谢你。这导致我的许多其他列创建了新的_Opp_Item列。知道如何将其仅限于价格列吗?@tgile512将DataFrame
合并为三列,即item、Price和Supplier