【问题标题】:Pandas groupby indexing before and after transform转换前后的 Pandas groupby 索引
【发布时间】:2013-02-04 12:42:21
【问题描述】:

我解决这个问题的动机是我试图对记录进行重复数据删除。有些字段可以删除,但我想要其他字段的总和。 对于以下数据框,

In [48]: rand = np.random.RandomState(1)
         df = pd.DataFrame({'A': ['foo', 'bar'] * 2 + ['baz', 'qux'],
                                        'B': rand.randn(6),
                                        'C': rand.randint(0, 20, 6),
         })
In [49]: df.sort('A', inplace=1)
Out[49]:      A         B   C
         1  bar -0.611756  18
         3  bar -1.072969  10
         4  baz  0.865408  14
         2  foo -0.528172  11
         0  foo  1.624345   5
         5  qux -2.301539  18

我想对具有相同A 值的记录进行重复数据删除,但保留B 的总和(在某些情况下可能还有C)。我认为 groupby 的转换应该做我想要的:

In [50]: df.groupby('A')[['B']].transform(sum)
Out[50]:           B
         1 -1.684725
         3 -1.684725
         4  0.865408
         2  1.096174
         0  1.096174
         5 -2.301539

但由于某种原因,我注意到在最后索引时它并没有给我想要的东西:

In [51]: df.groupby('A').transform(sum)[['B']]
Out[51]:           B
         1 -0.611756
         3 -1.072969
         4  0.865408
         2 -0.528172
         0  1.624345
         5 -2.301539

为什么会有差异?此外,当我尝试在 2 列上进行转换时,它并没有达到我的预期:

In [52]: df.groupby('A')[['B', 'C']].transform(sum) #same result as df.groupby('A').transform(sum)[['B', 'C']]
Out[52]:           B   C
         1 -0.611756  18
         3 -1.072969  10
         4  0.865408  14
         2 -0.528172  11
         0  1.624345   5
         5 -2.301539  18

我不介意这种情况下的差异,但在我正在开发的应用程序中,它实际上正在做相反的事情,但我找不到重现它的示例(即,df.groupby('A').transform(sum)[['B', 'C']] 给了我什么我想要,但更快的df.groupby('A')[['B', 'C']].transform(sum) 没有)。

【问题讨论】:

  • 我的猜测是它与被转换的维度有关。在您的第一个示例中,您选择一列进行总结。在第二个中,您对整个组求和,然后选择 B 列。转换机制有点神秘,同意。

标签: group-by dataframe transform pandas


【解决方案1】:

我认为它在于transform 方法。如果您查看documentation,它会说transform 返回一个对象,该对象的索引与被分组的对象相同(相同大小)。其实你的

df.groupby('A').transform(sum)[['B']]

根本不做任何求和。

如果您只需要总和,那么:

df.groupby('A')[['B']].sum()

或者这个:

df.groupby('A').sum()[['B']]

应该这样做,它们会产生相同的结果。

【讨论】:

  • 我希望它与原始数据框的形状相同。 In [50] 给了我想要的输出,我只是想知道为什么 51 没有。
  • 您能否给出可重现的示例,我们可以更轻松地为您提供帮助。
  • 我不明白,你不能重现我上面的代码吗?我的主要问题是关于上面输入 5051 之间的差异,我预计会产生相同的输出。有什么我应该说清楚的吗?
猜你喜欢
  • 2020-05-18
  • 1970-01-01
  • 2018-07-24
  • 2018-09-22
  • 2014-11-15
  • 1970-01-01
  • 2020-01-27
  • 2018-08-29
  • 2018-04-17
相关资源
最近更新 更多