带股票与日期多层索引的Pandas DataFrame实现Dummy列0/1连续符号计数
连续Dummy值计数实现方案
首先完成前置校验,保证数据按股票、交易时间升序排列,避免计数顺序错乱:
df = df.sort_index()
可直接通过以下代码生成符合规则的Counter列:
# 1. 按股票分组,标记连续相同Dummy值的分段ID # 同组内Dummy与上一行取值不同时标记为新段,累计后得到唯一段号 segment_id = df.groupby(level='stock')['Dummy'].diff().ne(0).cumsum() # 2. 按股票+连续段分组,计算段内从1开始的累计序号 seq = df.groupby(['stock', segment_id]).cumcount() + 1 # 3. 匹配正负规则:连续取值为1取正、连续取值为0取负 df['Counter'] = seq * (2 * df['Dummy'] - 1)
等价临时列写法
如果不习惯直接传入序列作为分组键,可通过临时列实现完全相同的逻辑:
df = df.sort_index() # 存储分段ID的临时列 df['_seg'] = df.groupby(level='stock')['Dummy'].diff().ne(0).cumsum() # 计算最终Counter列 df['Counter'] = (df.groupby(['stock', '_seg']).cumcount() + 1) * (2 * df['Dummy'] - 1) # 删除临时列 df.drop(columns='_seg', inplace=True)
结果验证
执行代码后输出的Counter列与预期完全一致:
print(df)
输出效果:
Dummy Counter stock datetime AAPL 2015-01-02 0 -1 2015-01-03 0 -2 2015-01-04 1 1 2015-01-05 1 2 MSFT 2015-01-02 1 1 2015-01-03 1 2 2015-01-04 0 -1 2015-01-05 1 1
内容的提问来源于stack exchange,提问作者Niccola Tartaglia
相关产品推荐
相关产品推荐

