Как сделать фильтрацию по логике с помощью группы панд по - PullRequest
0 голосов
/ 15 марта 2019

У меня есть фрейм данных

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, кол-во в наличии <кол-во <кол-во в наличии, то вернуть мин. (Кол-во в наличии).Свободна) цена поставщика, поэтому фрейм данных будет выглядеть как </p>

 Id  Qty  Vendor Price  Qty Avail
 1    4            23          0
 2    8            40          8
 3    5          1000          0

Я не могу понять логику для этого.Пожалуйста, помогите.

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

Из того, что я понимаю, используйте это:

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
1 голос
/ 15 марта 2019

Во-первых, ваша логика не имеет большого смысла, как указано, поскольку у вас есть несколько кол-во на один идентификатор.так что группировка по первым означает, что вы не можете напрямую определить, является ли Qty

, что, как говорится, ваш производный вывод, кажется, хочет, чтобы вы выбрали самую маленькую цену поставщика и наибольшее количестводоступность среди тех, где 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)
...