Как отфильтровать данные в одной серии, используя в качестве фильтра другую серию?

#python #pandas #dataframe #series #data-manipulation

Вопрос:

У меня есть фрейм данных, содержащий данные о продажах. Это выглядит примерно так:

 import pandas as pd df = pd.DataFrame({'order_id': ['A1', 'A2', 'A3', 'A4', 'A5'],   'customer_id': ['C1', 'C2', 'C3', 'C4', 'C5'],   'store': ['Hardware1', 'Grocery3', 'Beauty5', 'Pet2', 'Electronics4'],  'price': [20.59, 38.97, 56.84, 89.88, 156.64],  'rating': [5, 4, 3,'NA',4]})  

Я хочу предложить акционное предложение магазинам, которые отвечают следующим условиям:

  1. У магазина должно быть более 30 оценок в кадре данных
  2. Магазин должен иметь средний рейтинг более 4

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

Я в тупике от того, как лучше всего разбить данные для достижения этой цели. Я думал начать с создания подмножества фрейма данных с необходимыми мне данными, которые выглядели бы так:

 promo = df[['store', 'rating']]  

После этого я не уверен, что лучше всего делать. Я не уверен, следует ли мне создавать функцию, которая будет определять среднюю оценку, и использовать функцию с методом .apply() в «хранилище». Однако я не уверен, что функция имеет смысл, так как я не знаю, как учитывать магазин при определении средних оценок. Я думал о:

 promo.groupby('store')['rating']  

Однако, пока я не уберу «рейтинг», чтобы иметь дело со значениями NA или игнорировать их, я тоже не знаю, имеет ли это смысл. Я также думал об использовании .where (), однако я не знаю, что бы я определил в качестве фильтра для применения к серии «магазин».

Любые мысли будут оценены по достоинству.

Ответ №1:

Вы можете использовать GroupBy.count для подсчета количества оценок для каждой группы и GroupBy.mean . Панды должны GroupBy.agg агрегировать данные. Мы используем count и mean агрегируем данные в каждой группе.

 #Convert 'NA' to NaN df['rating'] = df['rating'].replace('NA', np.nan) #dtype is float here. # To maintain ints we have to use `.astype('Int64') which supports Nullable int. # df['rating'] = df['rating'].replace('NA', np.nan).astype('Int64') # Capital I.  # `count` doesn't include NA values. stores = df.groupby('store')['rating'].agg(('count', 'mean')).reset_index() m = stores['count'].gt(30) amp; stores['mean'].gt(4) # Stores with more than 30  # rating and avg. rating gt; 4 out = stores.loc[m, "store"]