#python #pandas #dataframe
#питон #панды #фрейм данных
Вопрос:
У меня есть фрейм данных 1, который показывает рейтинг аудитории и жанр каждого фильма:
movie_id| rating | action | comedy | drama 0 4 1 1 1 1 5 0 1 0 2 3 0 1 1
1 для экшена означает, что это боевик, а 0 означает, что это не так.
Я извлек средний рейтинг для одного жанра. Действие например, я сделал это:
new=df1[df1["action"]==1] new['rating'].mean()
что показывает 4. Но теперь я должен извлечь средний рейтинг для всех жанров, который должен выглядеть так:
action | comedy | drama 4 4 3.5
Есть какие-нибудь советы о том, как подойти?
Ответ №1:
В вашем случае мы можем выбрать столбцы, а затем where
все от 0 до NaN
и mul
с рейтингом
out = df.loc[:,['action','comedy','drama']].where(lambda x : x==1).mul(df.rating,axis=0).mean() Out[377]: action 4.0 comedy 4.0 drama 3.5 dtype: float64
Если вам нужен фрейм данных
out = out.to_frame().T
Ответ №2:
Вы можете переплавить столбцы жанров и отфильтровать, чтобы сохранить значения, равные только 1. Затем сгруппируйте по жанрам и рассчитайте среднее значение.
pd.melt( df, value_vars=["action", "comedy", "drama"], var_name="genre", id_vars=["movie_id", "rating"], ).query("value == 1").groupby("genre")["rating"].mean()
что дает
genre action 4.0 comedy 4.0 drama 3.5 Name: rating, dtype: float64
Ответ №3:
Умножьте rating
столбец на action
, comedy
и drama
столбцы, замените 0 на np.nan и вычислите среднее значение:
(df.iloc[:, 2:] .mul(df.rating, axis = 0) # mean implicitly excludes nulls during computations .replace(0, np.nan) .mean() ) action 4.0 comedy 4.0 drama 3.5 dtype: float64
Вышеизложенное возвращает серию, если вы хотите, чтобы фрейм данных, такой как выходные данные, переходил mean
в agg:
(df.iloc[:, 2:] .mul(df.rating, axis = 0) .replace(0, np.nan) .agg(['mean']) # note the `mean` is in a list ) action comedy drama mean 4.0 4.0 3.5