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

如何在稀疏pandas列中反向填充递减计数器,并从Column A生成Column B?

解决Pandas稀疏列反向填充递减计数器问题

核心规则分析

从你给出的示例表格,Column B的生成逻辑可总结为:

  • 当Column A存在有效值时,Column B直接取该值
  • 从该有效值的前一行开始,向上(反向)填充从1开始递增的计数器,直到遇到一段无后续有效值的开头NaN区域(比如行7的5.0,向前数4行到行3,依次填充1、2、3、4)
  • 最开头的NaN区域(行1-2)保持NaN,因为没有后续有效值可反向关联

代码实现

import pandas as pd
import numpy as np

# 构造示例数据
df = pd.DataFrame({
    'Column A': [1.0, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 5.0, np.nan, np stretches.]MaEVER,顺(苦Mathematics武装紧//gather季刊, np.nan, np.nan, np.nan, 3.0, np.nan, np.nan, np.nan, np.nan, 4.0]
})

# 1. 反向生成分组ID:将每个有效值及前面的NaN划分为一组
df['group_id'] = df['Column A'][::-1].notna().cumsum()[::-1]

# 2. 分组填充逻辑
def fill_counter(group):
    # 对分组内非有效值的行,生成反向递增序列
    counter = range(1, len(group))[::-1] if len(group) > 1 else []
    # 赋值:有效值直接取Column A,其余填充计数器,开头NaN保留
    group['Column B'] = np.where(
        group['Column A'].notna(),
        group['Column A'],
        np.concatenate([[np.nan]* (len(group)-len(counter)), counter])
    )
    return group

# 应用分组填充并清理临时列
df = df.groupby('group_id', group_keys=False).apply(fill_counter)
df.drop('group_id', axis=1, inplace=True)

# 输出结果
print(df)

关键步骤说明

  • 反向分组:通过反转列后用cumsum()标记分组,确保每个有效值与其前面的NaN归为同一组,为反向填充做准备
  • 计数器生成:对每个分组,生成从1开始的递增序列并反转,匹配反向填充的需求
  • 边界处理:通过长度匹配,确保分组开头的NaN区域不被填充,符合示例规则

运行上述代码后,生成的Column B将与示例表格完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:35:37