按用户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)
代码说明
- 按
user_id分组后,对每组重置索引,便于计算行与行之间的距离 - 分别定位组内
col2非空值的位置和col1=0的位置 - 遍历每个
col1=0的行,查找其后方最近的col2非空值,若两者间距≤10,则填充该区间内的col2值 - 合并所有分组的处理结果,得到最终数据集
内容的提问来源于stack exchange,提问作者prof32
相关产品推荐
相关产品推荐

