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

Pandas中groupby结合Diff()计算仪表读数差值全为NaN的问题

解决水表月度读数差值计算问题

问题根源

你用["year", "month", "houseid-meterid"]分组是错误的——这样每个分组只会包含单个用户单月的1条记录,diff()根本找不到同组的下一条数据,自然全返回NaN。

正确实现步骤

  1. 先确保数据按时间排序:差值计算依赖记录的时间顺序,必须先按houseid-meterid和Datetime升序排列,保证每个水表的记录是按时间先后排列的。
  2. 按单个水表分组计算:只需要按houseid-meterid分组,计算当前月与下一月的读数差。

代码实现

方式1:用shift(-1)直接计算(更直观)

# 先排序,保证时间顺序正确
water_df = water_df.sort_values(by=["houseid-meterid", "Datetime"])

# 分组后获取下一月的读数,减去当前读数得到consumption
water_df["consumption"] = water_df.groupby("houseid-meterid")["cleaned_quantity"].shift(-1) - water_df["cleaned_quantity"]

方式2:用diff(-1)取反

# 先排序
water_df = water_df.sort_values(by=["houseid-meterid", "Datetime"])

# diff(-1)返回当前值-下一个值,取反得到下一个值-当前值
water_df["consumption"] = -water_df.groupby("houseid-meterid")["cleaned_quantity"].diff(-1)

说明

  • 两种方式都能得到你示例中的结果:比如2019-02的23.0和2019-03的43.0,差值为20.0。
  • 每个水表的最后一条记录(最新月份)的consumption会是NaN,因为没有下一月的数据,你可以用water_df["consumption"] = water_df["consumption"].fillna(0)或者其他方式处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:15:34