Python中同DataFrame内关联ConfigID行的空值填充方法
实现DataFrame同组空值行的数值填充(按ConfigID前缀分组)
当然可以实现,核心思路是先按ConfigID的前缀(去掉末尾的B/G)分组,再将组内非空值填充到同组的空值行中,具体步骤和代码如下:
原始数据与需求回顾
你提供的原始DataFrame中,每个ConfigID前缀对应两行(后缀B/G),其中一行有完整数据,另一行除ConfigID和Duration外均为空值,需要将有值行的数据复制到同组的空值行,得到目标DataFrame。
解决方案代码
import pandas as pd # 原始数据 dataFrame_Original = pd.DataFrame( { "Region": ['1701656754', '', '1601656754', ''], "Directory": [153623, '', 153623, ''], "MigrDate": ['20221213', '', '20221214', ''], "MigrFrm": ['NBD Wty, Contract', '', 'Orlando, Contract', ''], "MigrTo": ['AMK1', '', 'AMK2', ''], "MemID": ['FI00', '', 'FI08', ''], "Ponts": ['854621544', '', '521354662', ''], "Eroom": ['FINNISH POST TIME DE', '', 'English Pre Dent', ''], "ConfigID": ['84460001B', '84460001G', '34460001B', '34460001G'], "Duration": ['AM02', 'AMK1', 'AUM02', 'AUMK1'] } ) # 1. 将空字符串转为pandas可识别的缺失值pd.NA df = dataFrame_Original.replace('', pd.NA) # 2. 生成分组键:提取ConfigID去掉最后一位(区分B/G组) df['GroupID'] = df['ConfigID'].str[:-1] # 3. 对需要填充的列(排除ConfigID、Duration、GroupID)按组填充 fill_columns = [col for col in df.columns if col not in ['ConfigID', 'Duration', 'GroupID']] df[fill_columns] = df.groupby('GroupID')[fill_columns].transform(lambda x: x.ffill().bfill()) # 4. 清理临时列并将残留缺失值转回空字符串(可选,确保格式统一) dataFrame_Result = df.drop('GroupID', axis=1).fillna('') # 查看结果 print(dataFrame_Result)
代码说明
- 缺失值转换:把原始数据中的空字符串转为
pd.NA,让pandas的填充函数能正确识别缺失值; - 分组逻辑:通过
str[:-1]提取ConfigID的前缀,将后缀为B和G的行归为同一组; - 组内填充:使用
groupby.transform结合ffill()和bfill(),确保组内无论哪一行有值,都能填充到同组的空值行; - 格式还原:最后删除临时分组列,将可能残留的缺失值转回空字符串,保持与原始数据格式一致。
结果对比
运行代码后得到的dataFrame_Result与你提供的dataFrame_Expected完全一致,也可通过下图直观对比:

内容的提问来源于stack exchange,提问作者Learner_Ash
相关产品推荐
相关产品推荐

