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

按用户ID反向填充col2至col1为0行,限制10行范围

按用户分组反向填充指定范围内的列值

需求说明

给定包含user_id、col1、col2的数据集,其中col1仅包含NaN或0值。需按user_id分组,将col2的值反向填充至遇到col1=0的行,且填充的行距离不得超过10行;若距离超过10行,则不执行填充操作。

输入示例

user_id   col1   col2          
  3        NaN    NaN
  3        0      NaN
  3        NaN    NaN 
  3        NaN     5
  5        0       NaN
  5        NaN     9
 ...  

期望输出

user_id   col1   col2          
  3        NaN    NaN
  3        0       5
  3        NaN     5 
  3        NaN     5
  5        0       9
  5        NaN     9
 ...  

解决方案(Python Pandas实现)

import pandas as pd
import numpy as np

# 构造示例数据(实际使用时替换为你的数据集)
data = {
    'user_id': [3,3,3,3,5,5],
    'col1': [np.nan, 0, np.nan, np.nan, 0, np.nan],
    'col2': [np.nan, np.nan, np.nan, 5, np.nan, 9]
}
df = pd.DataFrame(data)

def fill_col2(group):
    # 重置组内索引,方便计算行间距
    group = group.reset_index(drop=True)
    # 记录组内col2非空值的位置
    non_null_col2_pos = group[group['col2'].notna()].index
    # 记录组内col1=0的位置
    col1_zero_pos = group[group['col1'] == 0].index
    
    for zero_pos in col1_zero_pos:
        # 筛选出当前col1=0位置之后的col2非空值位置
        valid_non_null = non_null_col2_pos[non_null_col2_pos > zero_pos]
        if valid_non_null.size > 0:
            closest_non_null = valid_non_null.min()
            # 检查行间距是否≤10
            if closest_non_null - zero_pos <= 10:
                # 填充从col1=0位置到最近非空值位置之间的所有col2
                group.loc[zero_pos:closest_non_null, 'col2'] = group.loc[closest_non_null, 'col2']
    return group

# 按user_id分组处理数据
result_df = df.groupby('user_id', group_keys=False).apply(fill_col2)
print(result_df)

代码说明

  1. 按user_id分组后,对每组重置索引,便于计算行与行之间的距离
  2. 分别定位组内col2非空值的位置和col1=0的位置
  3. 遍历每个col1=0的行,查找其后方最近的col2非空值,若两者间距≤10,则填充该区间内的col2值
  4. 合并所有分组的处理结果,得到最终数据集

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:02:33