我对Python比较陌生,无法找到问题的答案。
假设我已将DataFrame保存到变量影片中。 DataFrame看起来有点像这样:
Genre1 Genre2 Genre3 sales
Fantasy Drama Romance 5
Action Fantasy Comedy 3
Comedy Drama ScienceFiction 4
Drama Romance Action 8
我想做的是获得Genre1,Genre2或Genre3中任何一列中出现的每个独特类型的平均销售额。 我尝试了一些不同的东西。我现在拥有的是:
for x in pd.unique(movies[['Genre1','Genre2','Genre3']].values.ravel()):
mean_genre = np.mean(movies['sales'])
print(x, mean_genre)
我得到的结果是:
Fantasy 5.0
Drama 5.0
Romance 5.0
Action 5.0
Comedy 5.0
ScienceFiction 5.0
所以它确实让我获得了三列中的独特类型,但它计算了整个列销售的平均值。如何计算Genre1,Genre2和Genre3三个列中任何一个中出现的每个独特类型的平均销售额?例如对于流派'幻想',它应该使用第1行和第2行来计算平均销售额。
答案 0 :(得分:1)
这是一个更短的版本:
allGenre=pd.unique(movies[['Genre1','Genre2','Genre3']].values.ravel())
for genre in allGenre:
print("%s : %f") % (genre,movies[movies.isin([genre]).any(1)].sales.mean())
答案 1 :(得分:0)
我不确定这是你想要达到的目标,但这应该是每种类型的销售价值(每次遇到它):
all_genres = pd.unique(movies[['Genre1','Genre2','Genre3']].values.ravel())
dff = pd.DataFrame(columns=['Nb_sales', 'Nb_view'],
index=all_genres, data=0)
for col in ['Genre1', 'Genre2', 'Genre3']:
for genre, value in zip(movies[col].values, movies['sales'].values):
dff.loc[(genre, 'Nb_sales')] += value
dff.loc[(genre, 'Nb_view')] += 1
然后你可以计算平均值:
>>> dff['Mean'] = dff.Nb_sales / dff.Nb_view
>>> dff
Nb_sales Nb_view Mean
Romance 13 2 6.500000
Comedy 7 2 3.500000
ScienceFiction 4 1 4.000000
Fantasy 8 2 4.000000
Drama 17 3 5.666667
Action 11 2 5.500000
更紧凑的解决方案可能是:
all_genres = pd.unique(movies[['Genre1','Genre2','Genre3']].values.ravel())
mean_series = pd.Series(index=all_genres)
for genre in all_genres:
mean_series[genre] = movies.sales.loc[movies.eval(
'Genre1 == "{0}" or Genre2 == "{0}" or Genre3 == "{0}"'
.format(genre)).values].mean()
# Or in one (long) line:
mean_df = pd.DataFrame(columns=['Genre'], data=all_genres)
mean_df['mean'] = mean_df.Genre.apply(
lambda x: movies.sales.loc[movies.eval(
'Genre1 == "{0}" or Genre2 == "{0}" or Genre3 == "{0}"'
.format(x)).values].mean())
他们两人都会打印你的结果:
>>> print(mean_series)
Fantasy 4.000000
Drama 5.666667
(....)