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
相关产品推荐
相关产品推荐

