Pandas中groupby结合Diff()计算仪表读数差值全为NaN的问题
解决水表月度读数差值计算问题
问题根源
你用["year", "month", "houseid-meterid"]分组是错误的——这样每个分组只会包含单个用户单月的1条记录,diff()根本找不到同组的下一条数据,自然全返回NaN。
正确实现步骤
- 先确保数据按时间排序:差值计算依赖记录的时间顺序,必须先按
houseid-meterid和Datetime升序排列,保证每个水表的记录是按时间先后排列的。 - 按单个水表分组计算:只需要按
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
相关产品推荐
相关产品推荐

