Извлеките среднее значение для каждого столбца в Панд

#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