【问题标题】:Why doesn't groupby sum convert boolean to int or float?为什么 groupby sum 不将布尔值转换为 int 或 float?
【发布时间】:2016-11-29 11:27:03
【问题描述】:

我将从 3 个简单的例子开始:

pd.DataFrame([[True]]).sum()

0    1
dtype: int64

pd.DataFrame([True]).sum()

0    1
dtype: int64

pd.Series([True]).sum()

1

所有这些都符合预期。这是一个更复杂的例子。

df = pd.DataFrame([
        ['a', 'A', True],
        ['a', 'B', False],
        ['a', 'C', True],
        ['b', 'A', True],
        ['b', 'B', True],
        ['b', 'C', False],
    ], columns=list('XYZ'))

df.Z.sum()

4

也如预期的那样。但是,如果我groupby(['X', 'Y']).sum()

我希望它看起来像:

我在想错误。还有其他解释吗?


根据@unutbu 的回答

pandas 正在尝试将其重铸为原始 dtype。我曾想,也许我表演的 group by 并没有真正 groupby 任何东西。所以我尝试了这个例子来测试这个想法。

df = pd.DataFrame([
        ['a', 'A', False],
        ['a', 'B', False],
        ['a', 'C', True],
        ['b', 'A', False],
        ['b', 'B', False],
        ['b', 'C', False],
    ], columns=list('XYZ'))

我会groupby('X')sum。如果@unutbu 是正确的,这些和应该是10 并且可以转换为bool,因此我们应该看到bool

df.groupby('X').sum()

果然……bool

但如果过程相同但值略有不同。

df = pd.DataFrame([
        ['a', 'A', True],
        ['a', 'B', False],
        ['a', 'C', True],
        ['b', 'A', False],
        ['b', 'B', False],
        ['b', 'C', False],
    ], columns=list('XYZ'))

df.groupby('X').sum()

吸取的教训。执行此操作时,请始终使用 astype(int) 或类似名称。

df.groupby('X').sum().astype(int)

为任一场景提供一致的结果。

【问题讨论】:

  • 我可能也将其称为错误,尤其是因为您在df['Z'] = df['Z'].astype(int) 之后得到了您所期望的。去举报,看看pandas的开发者有没有这种行为的原因。
  • 发生这种情况是因为_cython_agg_blocks 调用_try_coerce_and_cast_result 调用_try_cast_result 尝试返回与原始值具有相同dtype 的结果(在这种情况下,@ 987654353@).
  • @unutbu 我可以看到该决定的优点。但是,这似乎意味着在使用组聚合时,我们应该始终转换为我们期望的类型。问题,您能否将此作为答案发布,使其显示为已回答?谢谢!

标签: python pandas


【解决方案1】:

这是因为_cython_agg_blocks 调用_try_coerce_and_cast_result 调用_try_cast_result 尝试返回与原始值(在本例中为bool)具有相同dtype 的结果

Z 具有 dtype bool(并且所有组不超过一个 True 值)时,这会返回一些特殊的东西。如果任何组有 2 个或更多 True 值,则结果值是浮点数,因为 _try_cast_result 不会将 2.0 转换回布尔值。

_try_cast_resultZ 具有 dtype int 时会做一些更有用的事情:在内部,Cython 聚合器由 df.groupby(['X', 'Y']).sum() 返回数据类型为 floatresult。然后,_try_cast_result 将结果返回到 dtype int

【讨论】:

  • 那么,那么呢?错误修复了吗?我对 pandas 1.2.4 版也有同样的问题
猜你喜欢
  • 2012-02-25
  • 2011-06-11
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 2011-04-17
相关资源
最近更新 更多