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

Pandas行内两数值间隔NaN统计及不规则间隔消费数据均摊实现

累计消费序列转日均消费实现方案

实现逻辑

  • 以行为单位处理每个消费者的消费序列
  • 提取所有非空(非NaN)的累计测量值的位置和对应数值
  • 第一个测量值按要求除以23(可根据需求调整除数,允许误差)
  • 后续每个测量值除以「当前测量值位置与前一个测量值位置的差」,该差值刚好等于间隔的NaN数量+1,符合需求规则
  • 其余无测量值的位置保留NaN

实现代码

import pandas as pd
import numpy as np

# 读取数据后先将SP ID设为行索引,方便按行处理
df = pd.read_csv("你的数据路径.csv") # 替换为你的实际数据读取逻辑
df = df.set_index('SP ID')

def process_consumption_row(row):
    # 筛选当前行所有有效测量值的位置和数值
    is_valid = ~row.isna()
    valid_pos = np.where(is_valid)[0]
    valid_vals = row[is_valid].values
    
    # 初始化结果序列,默认全为NaN
    res = pd.Series(np.nan, index=row.index)
    if len(valid_pos) == 0:
        return res
    
    # 处理第一个测量值,按要求除以23,需要和示例输出对齐可改为25
    res[valid_pos[0]] = round(valid_vals[0] / 23, 3)
    
    # 处理后续所有测量值
    for i in range(1, len(valid_pos)):
        # 间隔 = 当前位置 - 上一个有效测量值的位置 = 间隔NaN数 + 1
        interval = valid_pos[i] - valid_pos[i-1]
        res[valid_pos[i]] = round(valid_vals[i] / interval, 3)
    
    return res

# 逐行应用处理逻辑,处理完成后恢复SP ID列为普通列
df_result = df.apply(process_consumption_row, axis=1).reset_index()

# 输出结果查看或者保存
print(df_result)
# df_result.to_csv("输出路径.csv", index=False)

验证说明

针对你给出的示例序列NaN, 10, NaN, NaN, NaN, NaN, NaN, NaN, 21, NaN...,代码运行后:

  • 第一个有效值位置索引为1,计算结果为10/23 ≈ 0.4347,和预期一致
  • 第二个有效值位置索引为8,间隔为8-1=7,计算结果为21/7=3,完全符合预期
  • 其余位置保留NaN,和输出要求匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:54:03