如何在稀疏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
相关产品推荐
相关产品推荐

