2017-08-17 14 views
2

ムービー名、それぞれのジャンル、ベクトル表現(numpy配列)を持つムービーデータフレームがあります。パンダのデータフレームと平均配列の列別

ID Year Title Genre Word Vector 
1 2003.0 Dinosaur Planet Documentary [-0.55423898, -0.72544044, 0.33189204, -0.1720... 
2 2004.0 Isle of Man TT 2004 Review Sports & Fitness [-0.373265237, -1.07549703, -0.469254494, -0.4... 
3 1997.0 Character Foreign [-1.57682264, -0.91265768, 2.43038678, -0.2114... 
4 1994.0 Paula Abdul's Get Up & Dance Sports & Fitness [0.3096168, -0.57186663, 0.39008939, 0.2868615... 
5 2004.0 The Rise and Fall of ECW Sports & Fitness [0.17175879, -2.38005066, -0.45771399, 1.32608... 

私はジャンル別にグループに好きで、ジャンルごとの平均ベクトル表現(ジャンルの各映画ベクトルの要素ごとの平均)を取得したいです。


私が最初に試さ:

movie_df.groupby(['Genre']).mean() 

をしかし、平均機能に組み込まれてはnumpyの配列の平均を取ることができません。

私はそうして、各グループに適用するために自分自身の関数を作成しようとしたが、私はこれが正しく適用されます使用しているかわからない:

def vector_average(group): 
    series_to_array = np.array(group.tolist()) 
    return np.mean(series_to_array, axis = 0) 

movie_df.groupby(['Genre']).apply(vector_average) 

任意のポインタをいただければ幸いです!

+0

あなたは(5) 'df.headをプリントアウト'とそれをここに貼り付けてくださいことはできますか? –

+0

はい、質問にあります。 –

+0

私はデータフレームのサンプルを提供する最善の方法に慣れていません。 – Matt

答えて

2

私が正しく理解していれば、コンポーネントワイズの平均を得るには、 SeriesGroupByに明示的にnp.meanを適用するだけです。

df.groupby('Genre')['Word Vector'].apply(np.mean) 

デモ

>>> df = pd.DataFrame({'Title': list('ABCDEFGHIJ'), 
         'Genre': list('ABCBBDCDED'), 
         'Word Vector': [np.random.randint(0, 10, 10) 
             for _ in range(len('ABCDEFGHIJ'))]}) 

>>> df 

    Genre Title      Word Vector 
0  A  A [3, 6, 8, 0, 4, 8, 1, 4, 0, 1] 
1  B  B [5, 4, 4, 4, 8, 7, 4, 3, 7, 2] 
2  C  C [1, 7, 6, 7, 3, 3, 8, 1, 8, 1] 
3  B  D [0, 4, 6, 7, 1, 5, 5, 0, 6, 7] 
4  B  E [8, 2, 1, 4, 1, 2, 0, 4, 9, 1] 
5  D  F [7, 9, 7, 8, 8, 7, 2, 9, 1, 3] 
6  C  G [0, 7, 1, 9, 6, 2, 1, 0, 3, 7] 
7  D  H [4, 7, 9, 4, 1, 5, 0, 3, 0, 6] 
8  E  I [5, 1, 5, 1, 8, 1, 1, 4, 5, 6] 
9  D  J [7, 9, 0, 1, 8, 3, 8, 8, 1, 0] 

>>> df.groupby('Genre')['Word Vector'].apply(np.mean) 

Genre 
A [3.0, 6.0, 8.0, 0.0, 4.0, 8.0, 1.0, 4.0, 0.0, ... 
B [4.33333333333, 3.33333333333, 3.66666666667, ... 
C [0.5, 7.0, 3.5, 8.0, 4.5, 2.5, 4.5, 0.5, 5.5, ... 
D [6.0, 8.33333333333, 5.33333333333, 4.33333333... 
E [5.0, 1.0, 5.0, 1.0, 8.0, 1.0, 1.0, 4.0, 5.0, ... 
Name: Word Vector, dtype: object 
+0

ありがとうございます!私はmovie_df.groupby(['Genre'])を試してみました。apply(np.mean)。それはID列とYear列の出力を持っていましたが、ベクトル列の出力はありませんでしたか? – Matt

+1

@perennial_nomad DataFrame全体で 'np.mean'を呼び出そうとすると、数値データ型のカラムの結果しか提供されません。ここで' 'Word Vector ''はオブジェクト型です。そして、あなたは大歓迎です! – miradulo

+0

別のフォローアップ - これはpandasシリーズを返します。これをto_frameを使用してデータフレームに書き込もうとすると、そのサイドのラベルとしてジャンルを含むワードベクトル列のみが返されます。 'Genre'と 'Word Vectors'を使って直接20 x 2 dfに変換する方法はありますか? – Matt

関連する問題