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

Pandas groupby分组后buy列NaN值替换与累计值填充问题

解决方案

你可以通过两种方式实现需求,核心是保证每个(小时级时间+价格)分组内的累计值能向下填充,初始无值的位置补0:

方法1:直接计算完整分组累计值(推荐)

这种方式无需先生成含NaN的buy列,一步到位得到符合要求的结果:

import pandas as pd
import math
from pandas import Timestamp

# 原始数据生成
Date = [Timestamp('2024-03-16 23:59:42'), Timestamp('2024-03-16 23:59:42'), Timestamp('2024-03-16 23:59:44'), Timestamp('2024-03-16 23:59:44'), Timestamp('2024-03-16 23:59:44'), Timestamp('2024-03-16 23:59:47'), Timestamp('2024-03-16 23:59:48'), Timestamp('2024-03-16 23:59:48'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49')]
Price = [0.6729, 0.6728, 0.6728, 0.6728, 0.6728, 0.673, 0.6728, 0.6729, 0.6728, 0.6728, 0.6728, 0.6728, 0.6728, 0.6728, 0.6728, 0.6728, 0.6728, 0.6728, 0.6729, 0.6728]
Side = [-1, -1, -1, 1, -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1]
Amount = [1579.2963000000002, 7.400799999999999, 6.728, 177.61919999999998, 797.2679999999999, 33650.0, 131.196, 48.448800000000006, 0.6728, 0.6728, 0.6728, 6.728, 0.6728, 1.3456, 0.6728, 0.6728, 0.6728, 0.6728, 0.6729, 0.6728]

df = pd.DataFrame({
    'Date':Date,
    'Price':Price,
    'Side':Side,
    'Amount':Amount
})

# 核心代码
df['hour'] = df['Date'].dt.floor('H')
# 仅保留买入单的Amount,非买入单设为0,再按小时+价格分组累计求和
df['buy'] = df.assign(amount_buy=df['Amount'].where(df['Side'] == 1, 0))\
              .groupby(['hour', 'Price'])['amount_buy'].cumsum()

print(df)

方法2:基于现有含NaN的buy列填充

如果你已经生成了含NaN的buy列,可以通过分组向前填充(保留分组内的累计值),再将剩余的NaN补0:

# 先执行你原来的代码生成buy列
df['buy'] = df[df['Side'] == 1].groupby([df['Date'].dt.floor('H'), 'Price'])['Amount'].cumsum()

# 分组向前填充,再补0
df['buy'] = df.groupby([df['Date'].dt.floor('H'), 'Price'])['buy'].ffill().fillna(0)

print(df)

说明

  • 两种方法都会按小时级时间+价格的组合分组,确保同一小时同一价格下的累计买入值能延续到后续非买入行
  • 初始未出现买入单的位置会自动填充为0,符合你期望的结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:27:08