#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]})
Я хочу предложить акционное предложение магазинам, которые отвечают следующим условиям:
- У магазина должно быть более 30 оценок в кадре данных
- Магазин должен иметь средний рейтинг более 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"]