在Pandas数据框中按列分组并对数组求平均值

7

我有一个电影数据框,其中包含电影名称、它们所属的类型以及向量表示(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()

但是内置的mean函数无法对numpy数组取平均值。

我尝试创建自己的函数来实现这个操作,然后将其应用于每个组,但我不确定这是否正确地使用了apply:

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)

任何建议都将不胜感激!


您能否在此处打印出 df.head(5) 并将其粘贴在这里? - cs95
是的,但是在问题中。 - cs95
我不熟悉提供数据框示例的最佳方法 - 在这里的建议也将不胜感激! - Matt
好的。你的“词向量”是一个numpy数组或列表的列吗? - cs95
它们是NumPy数组。 - Matt
2个回答

11

如果我的理解是正确的,要获取每个组件的平均值,你可以在'Word Vector'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

谢谢,这个可行!为了完整起见,我尝试了movie_df.groupby(['Genre']).apply(np.mean)。它输出了ID和Year列,但是vector列没有任何输出? - Matt
1
如果您尝试在整个DataFrame上调用np.mean,它只会为具有数值数据类型的列提供结果 - 在这里,'Word Vector'的数据类型是对象。不客气! - miradulo
另一个后续问题 - 这将返回一个pandas系列,当我尝试使用to_frame将其写入数据框时,它只返回带有流派标签的“Word Vector”列。是否有一种方法可以直接转换为20 x 2 df,并具有“Genre”和“Word Vectors”两列? - Matt
1
@perennial_nomad 可以尝试在我上面提供的解决方案中调用.reset_index()方法 :) - miradulo

0

顺便提一下

如果您的“词向量”列中有数字列表,则在执行之前必须将其转换为numpy数组:

df['Word Vector'] = df['Word Vector'].apply(np.array)
df.groupby('Genre')['Word Vector'].apply(np.mean)#.apply(list)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接