Pandas中基于前一行值条件递增填充NaN的实现方法
Pandas按分组递增填充ID列的NaN值
需求说明
需要为last unique id列的NaN值填充符合规则的ID:按Channel分组,同一分组内基于前一个有效ID,拆分出字母前缀和数字部分,数字依次加1后重新拼接成新ID。
输入数据
Channel last unique id 0 MYNTRA MN000351370 1 NYKAA NYK00038219 2 NYKAA NaN 3 NYKAA NaN 4 NYKAA NaN 5 NYKAA NaN 6 MYNTRA NaN 7 MYNTRA NaN 8 MYNTRA NaN 9 MYNTRA NaN 10 MYNTRA NaN 11 MYNTRA NaN
期望输出
Channel last unique id 0 MYNTRA MN000351370 1 NYKAA NYK00038219 2 NYKAA NYK00038220 3 NYKAA NYK00038221 4 NYKAA NYK00038222 5 NYKAA NYK00038223 6 MYNTRA MN000351371 7 MYNTRA MN000351372 8 MYNTRA MN000351373 9 MYNTRA MN000351374 10 MYNTRA MN000351375 11 MYNTRA MN000351376
解决方案
通过分组处理+正则拆分+序列生成实现,具体步骤如下:
- 导入依赖库
import pandas as pd import re
- 定义分组处理函数
对每个分组内的last unique id列做针对性处理:
- 从第一个非NaN值提取字母前缀和数字格式长度
- 生成从初始数字开始的连续递增序列
- 拼接前缀与格式化数字,替换NaN值
def fill_id(group): # 获取分组内第一个有效ID first_id = group['last unique id'].dropna().iloc[0] # 拆分前缀和数字部分 match = re.match(r'([A-Za-z]+)(\d+)', first_id) prefix = match.group(1) num_str = match.group(2) num_len = len(num_str) start_num = int(num_str) # 生成对应长度的连续数字序列 nums = range(start_num, start_num + len(group)) # 拼接成符合格式的新ID group['last unique id'] = [f"{prefix}{str(num).zfill(num_len)}" for num in nums] return group
- 按Channel分组并应用函数
# 构造输入DataFrame df = pd.DataFrame({ 'Channel': ['MYNTRA', 'NYKAA', 'NYKAA', 'NYKAA', 'NYKAA', 'NYKAA', 'MYNTRA', 'MYNTRA', 'MYNTRA', 'MYNTRA', 'MYNTRA', 'MYNTRA'], 'last unique id': ['MN000351370', 'NYK00038219', None, None, None, None, None, None, None, None, None, None] }) # 分组执行填充逻辑 filled_df = df.groupby('Channel', group_keys=False).apply(fill_id) print(filled_df)
代码说明
re.match(r'([A-Za-z]+)(\d+)', first_id):用正则拆分ID的字母前缀与数字部分,兼容不同长度的前缀和数字格式str(num).zfill(num_len):保持数字部分的位数与原ID一致,不足位数用0补全groupby('Channel', group_keys=False).apply(fill_id):按Channel分组,每个分组独立生成递增ID序列
运行代码后输出结果与期望完全一致。
内容的提问来源于stack exchange,提问作者sahil goyal
相关产品推荐
相关产品推荐

