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

