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