当前位置: 首页 > 面试题库 >

为什么groupby sum不能将布尔值转换为int或float?

郎欣然
2023-03-14
问题内容

我将从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的答案

熊猫正尝试将其重铸为原始dtype。我以为,也许我演奏过的组并没有真正地进行分组。所以我尝试了这个例子来测试这个想法。

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是正确的,则这些和应该是1和,0并且可以强制转换为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)

在两种情况下都能提供一致的结果。


问题答案:

发生这种情况是因为_cython_agg_blocks调用试图返回与原始值
相同的dtype 结果(在本例中为)的结果
_try_coerce_and_cast_result调用。_try_cast_result
__bool


当使用Zdtype
bool(并且所有组的True值不超过一个)时,这将返回一些特殊的信息。如果这些组中的任何一个具有2个或多个True值,则由于_try_cast_result未将2.0转换回布尔值,因此结果值是浮点型

_try_cast_result做更有用的东西时,Z有D型int:在内部,用Cython聚合通过使用 df.groupby(['X', 'Y']).sum()一个回报result的D型float。然后,_try_cast_result将结果返回到dtype int



 类似资料:
  • 问题内容: 我想知道为什么Java不允许将布尔值转换为整数,如下所示: 例如,这可以用一行代码来完成, 但似乎更好和更容易阅读的方法是允许类型转换,如和一样。Java为什么不包括此功能? 问题答案: 不允许这样做是因为Java设计人员(正确地)认识到C和C ++中的布尔/整数重载是错误的重要来源。 (我记得曾经写过一些设计原理的书,但我找不到。) 例如: 是合法的,但可能是用C或C ++编写的应用

  • 问题内容: 在Java中将a转换boolean为an 的最常用方法是什么int? 问题答案: ^^ PS : true = 1 and false = 0

  • 因此,我想知道是否有一个利索的方法来做这件事,除了

  • 问题内容: Java中的所有数字都应为int类型。以下行在Java> 1.5中是合法的 同样的机制去和实例。但是龙的作品完全不同。以下代码给出了编译时错误 Long对长类型使用自动装箱方法,因此 我看不到为什么不能将int赋给Long变量。关于这个问题有什么想法吗? 问题答案: 我认为问题不在于泛型转换原语和包装。问题是关于将int转换为java.lang.Long和将int转换为java.lan

  • 问题内容: 您可以将int隐式转换为double: 您可以将int显式转换为double: 您可以将double显式转换为int: 为什么不能将一个double隐式转换为int? : 问题答案: 的范围比宽。这就是为什么您需要显式强制转换。由于相同的原因,您不能隐式地从转换为:

  • 我习惯了C / Java,我可以在哪里使用?:如: 由于Go没有三元运算符,如何在go中执行此操作?