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

Pandas按月聚合非零采购数据时np.sum触发FutureWarning的问题咨询

环境信息
  • Python版本:python==3.12.0 (tags/v3.12.0:0fb18b0, Oct 2 2023, 13:03:39) [MSC v.1935 64 bit (AMD64)] on win32
  • 依赖库:
    import pandas as pd # pandas==2.1.3
    import numpy as np # numpy==1.26.1
    
数据与需求

原始数据框dfcardtype

Date       Purchases    Credits    Card Type
9   2019-03-13       0.00     150.00         visa     
21  2019-04-13    2031.67       0.00         visa
27  2019-04-24    1311.00       0.00         visa
33  2019-05-09    1021.11       0.00         visa
36  2019-05-17    1860.00       0.00         visa

需求

按月统计Purchases列的非零值数量及总和。

原代码与警告信息

原代码:

df = dfcardtype.groupby(pd.Grouper(key='Date',freq='M')).agg({'Purchases':[ np.count_nonzero,np.sum]})

触发的FutureWarning:

FutureWarning: The provided callable <function sum at 0x000001A352B6B380> is currently using SeriesGroupBy.sum.
In a future version of pandas, the provided callable will be used directly.
To keep current behavior pass the string "sum" instead.

解决方法

警告的核心原因是:pandas未来版本会直接执行传入的可调用对象(如np.sum),而非映射到SeriesGroupBy.sum。要保持现有统计逻辑并消除警告,只需将np.sum替换为字符串'sum'即可,np.count_nonzero可保留使用。

修正后代码

df = dfcardtype.groupby(pd.Grouper(key='Date', freq='M')).agg({
    'Purchases': [np.count_nonzero, 'sum']
})

可选替代方案(统一用lambda实现非零计数)

如果偏好统一的写法,也可以用lambda函数替代np.count_nonzero,结果完全一致:

df = dfcardtype.groupby(pd.Grouper(key='Date', freq='M')).agg({
    'Purchases': [lambda x: (x != 0).sum(), 'sum']
})

预期输出结果

Purchases          
       count_nonzero      sum
Date                         
2019-03-31           0      0.00
2019-04-30           2   3342.67
2019-05-31           2   2881.11

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:30:21