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 也就是说,您的导出输出似乎希望您在qty>=qty avail的那些选项中选择最小的供应商价格和最大的可用数量

如果是这种情况,您可以使用

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

谢谢你的帮助。在所有其他条件下,它运行良好。我编辑了我认为是错误的答案,结果发现未编辑的版本按预期运行。有人知道如何将我的答案恢复到预先编辑的版本吗?