np.mean表示跨多个列具有特定值的行

时间:2016-01-19 21:05:57

标签: python for-loop numpy

我对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行来计算平均销售额。

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
(....)