Python 3.x 如何使用pandas分组进行基于逻辑的过滤
我有一个数据框Python 3.x 如何使用pandas分组进行基于逻辑的过滤,python-3.x,pandas,group-by,Python 3.x,Pandas,Group By,我有一个数据框 df = pd.DataFrame({'Id' : [1, 1, 2,2, 3,3], 'Qty' : [4,4,8,8,5,5], 'Vendor Price' : [23,43, 100, 40, 1000, 1400], 'Qty Avail' :[0, 8, 2, 8, 0, 8]}) Out[159]: Id Qty Vendor Price Qty Ava
df = pd.DataFrame({'Id' : [1, 1, 2,2, 3,3],
'Qty' : [4,4,8,8,5,5],
'Vendor Price' : [23,43, 100, 40, 1000, 1400],
'Qty Avail' :[0, 8, 2, 8, 0, 8]})
Out[159]:
Id Qty Vendor Price Qty Avail
0 1 4 23 0
1 1 4 43 8
2 2 8 100 2
3 2 8 40 8
4 3 5 1000 0
5 3 5 1400 8
我想应用这样的逻辑,如果按Id分组,则数量有效<
数量<
Qty Avail然后返回最小(Qty Avail)供应商价格,否则返回最大(Qty Avail)供应商价格,因此数据框如下所示
Id Qty Vendor Price Qty Avail
1 4 23 0
2 8 40 8
3 5 1000 0
我无法理解这样做的逻辑。请帮助。首先,您的逻辑没有多大意义,因为您每个id都有多个Qty Avail。因此,对于给定id,通过“第一个”分组意味着您无法直接确定Qty
df1 = df.loc[df['Qty'] >= df['Qty Avail'] ,['Id','Qty','Vendor Price']].groupby(['Id', 'Qty']).min()
df2 = df.loc[df['Qty'] >= df['Qty Avail'] ,['Id','Qty','Qty Avail']].groupby(['Id', 'Qty']).max()
然后在id上加入这些
df3 = pd.merge(df1, df2, left_index = True, right_index = True)
据我所知,使用以下方法:
m=df.groupby(['Id','Qty'])['Qty Avail'].agg(['first','last']).reset_index()
m['Qty Avail']=np.where((m.Qty.gt(m['first']))&(m.Qty.lt(m['last'])),m['first'],m['last'])
df.merge(m[['Id','Qty Avail']],on=['Id','Qty Avail'])
Id Qty Vendor Price Qty Avail
0 1 4 23 0
1 2 8 40 8
2 3 5 1000 0
谢谢你的帮助。在所有其他条件下,它运行良好。我编辑了我认为是错误的答案,结果发现未编辑的版本按预期运行。有人知道如何将我的答案恢复到预先编辑的版本吗?