【问题标题】:Group by column in pandas dataframe and average arrays在熊猫数据框和平均数组中按列分组
【发布时间】:2018-01-25 08:38:01
【问题描述】:

我有一个电影数据框,其中包含电影名称、它们各自的流派和矢量表示(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) 并粘贴到这里吗?
  • 是的,但在问题中。
  • 我不熟悉提供数据框样本的最佳方式 - 这里的建议也将不胜感激!
  • 好的。您的 Word Vector 是一列 numpy 数组或列表?
  • 它们是 numpy 数组

标签: python arrays pandas numpy mean


【解决方案1】:

如果我理解正确,要获得组件平均值,您可以简单地将np.mean 明确应用于'Word Vector' SeriesGroupBy。

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 和年份列的输出,但向量列没有输出?
  • @perennial_nomad 如果您尝试在整个 DataFrame 上调用 np.mean,它只会为具有数字数据类型的列提供结果 - 这里,'Word Vector' 是对象类型。不客气!
  • 另一个后续 - 这将返回一个熊猫系列,当我尝试使用 to_frame 将其写入数据帧时,它只返回带有流派作为标签的单词向量列。有没有办法直接将“流派”和“词向量”转换为 20 x 2 df?
  • @perennial_nomad 就我上面提供的解决方案致电.reset_index(),也许:)
猜你喜欢
  • 2018-02-01
  • 1970-01-01
  • 2019-10-14
  • 2015-10-09
  • 2017-07-08
  • 2016-03-03
  • 2018-07-19
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多