У меня есть фрейм данных с товарами и их ценами, примерно так:
╔══════╦═════╦═══════╗
║ Item ║ Day ║ Price ║
╠══════╬═════╬═══════╣
║ A ║ 1 ║ 10 ║
║ B ║ 1 ║ 20 ║
║ C ║ 1 ║ 30 ║
║ D ║ 1 ║ 40 ║
║ A ║ 2 ║ 100 ║
║ B ║ 2 ║ 20 ║
║ C ║ 2 ║ 30 ║
║ D ║ 2 ║ 40 ║
║ A ║ 3 ║ 500 ║
║ B ║ 3 ║ 25 ║
║ C ║ 3 ║ 35 ║
║ D ║ 3 ║ 1000 ║
╚══════╩═════╩═══════╝
Я хочу исключить все строки из этого df, где средняя цена элемента превышает 200. Итак, отфильтрованный df должен выглядеть так:
╔══════╦═════╦═══════╗
║ Item ║ Day ║ Price ║
╠══════╬═════╬═══════╣
║ B ║ 1 ║ 20 ║
║ C ║ 1 ║ 30 ║
║ B ║ 2 ║ 20 ║
║ C ║ 2 ║ 30 ║
║ B ║ 3 ║ 25 ║
║ C ║ 3 ║ 35 ║
╚══════╩═════╩═══════╝
Я новичок в python и pandas, но на первом этапе я подумал о чем-то вроде этого, чтобы получить новый df для средних цен: avg_prices_df = df.groupby ('ItemID'). Price.mean (). Reset_index, а затем не уверен, как исходить оттуда. Не уверен, что даже этот первый шаг верен.
Чтобы еще больше усложнить ситуацию, я использую vaex для чтения данных в форме ndf5, так как у меня более 400 миллионов строк.
Большое спасибо за любой совет.
РЕДАКТИРОВАТЬ: Итак, у меня работает следующий код, хотя я уверен, что он не оптимизирован ..
`
создать фрейм данных с идентификаторами предметов и их средними ценами
df_item_avg_price = df.groupby (df.ItemID, agg = [vaex.agg.count ('ItemID'), vaex.agg.mean ('Price')])
отфильтровать этот новый фрейм данных по порогу средней цены
df_item_avg_price = (df_item_avg_price [df_item_avg_price ["P_r_i_c_e_mean"] ‹= 50000000])
создать список идентификаторов товаров, средняя цена которых ниже порогового значения
items_in_price_range = df_item_avg_price ['ItemID']. tolist ()
отфильтровать исходный фрейм данных, чтобы включить строки только с элементами в ценовом диапазоне
filter_df = df [df.ItemID.isin (items_in_price_range)] `Есть способ сделать это лучше?