You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么pandas调用.sum(axis=1)含numpy datetime64时返回全0?

现象产生的核心原因

该问题本质是pandas的底层设计逻辑和类型判断规则导致的,核心涉及两个关键点:

  • pandas的DataFrame是按列存储的结构,每一列有全局统一的dtype,不会为同一列的不同行单独设置类型。
  • 聚合类方法(比如sum)的numeric_only参数是基于列的dtype做判断,而非逐行判断每个元素的实际类型。

具体到你的案例的执行逻辑:

  1. 你构造的df2中,A、B两列都同时包含datetime64类型和整数类型,pandas无法为这两列分配统一的数值/时间类型,只能将列的dtype设为object。
  2. 当你调用sum(axis=1, numeric_only=True)时,pandas会直接过滤掉所有dtype不属于数值范畴(int/float/bool等)的列,你的两列都是object类型,直接被全部排除。空值序列求和的默认结果为0,所以两行都返回0。
  3. 就算你不手动设置numeric_only=True,pandas对object列执行求和时,会先尝试对元素做加法操作:datetime64类型本身不支持两个时间直接相加(会抛出类型错误),pandas会自动将这类无法执行加法的object列也排除在求和范围外,最终结果还是0。

和字符串测试案例的差异原因:

你用字符串替换datetime64的测试案例中,没有设置numeric_only=True,字符串类型支持加法(拼接操作),整数也支持加法,pandas不会排除object列,会逐元素执行加法,所以得到你预期的结果。


实现按行分别处理的方案:

如果要达成逐行判断类型求和的需求,可以用逐行apply的方式自定义逻辑:

import pandas as pd
import numpy as np

df2 = pd.DataFrame(
    [[np.datetime64('2021-01-01'), np.datetime64('2021-01-01')], [2, 3]],
    columns=['A', 'B'])

# 只对数值类型的元素求和
res = df2.apply(lambda row: sum(v for v in row if isinstance(v, (int, float, np.number))), axis=1)
print(res)
# 输出:
# 0    0
# 1    5
# dtype: int64

内容的提问来源于stack exchange,提问作者troels

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:36:07