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

Pandas按特定条件计数求和仅返回nan值问题排查

问题原因与解决方案

结果全为NaN的核心原因

你编写的代码逻辑存在本质问题:df['datet'] <= df['datet'] + datetime.timedelta(days=1)是整列逐元素对齐比较,返回的布尔序列仅能过滤当前行本身是否满足条件,没有实现「拿当前行日期和所有行日期逐一对比」的需求。过滤后得到的子DataFrame调用.sum()时默认按列聚合,datetime列求和结果为NaT,赋值给整列时所有值就变为NaN。

两个疑问解答

  • sum和count的统计结果是否一致?
    完全不一致。条件统计场景下,对布尔值序列用sum是将True计为1、False计为0求和,得到符合条件的记录数;count是统计序列中非空值的总数量,和条件是否成立无关,你当前需求只能用sum对布尔掩码求和。
  • sum触发未来警告的原因?
    你直接对包含datetime类型列的完整DataFrame调用sum方法,pandas未来版本会禁止对datetime列执行默认求和操作,因此抛出未来警告,只对布尔值序列求和就不会触发该警告。

正确实现代码

import pandas as pd
import datetime

df = pd.DataFrame({'datet': [pd.to_datetime("2020-03-04 00:00:00"), pd.to_datetime("2020-03-05 00:00:00"),
                             pd.to_datetime("2020-03-09 00:00:00"), pd.to_datetime("2020-03-10 00:00:00"),
                             pd.to_datetime("2020-03-11 00:00:00"), pd.to_datetime("2020-03-12 00:00:00")]})

df["caseIntensity"] = df['datet'].apply(lambda cur_date: ((df['datet'] >= cur_date - datetime.timedelta(days=1)) & 
                                                   (df['datet'] <= cur_date + datetime.timedelta(days=1))).sum())

运行后caseIntensity列的结果为[2, 2, 2, 3, 3, 2],符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:36:02