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

