如何使用pandas按同Master分组规则迭代填充表格空值
实现方案
我这里提供Python+pandas的两种实现方式,优先推荐向量化操作,性能比逐行循环高很多,也不用写复杂的循环逻辑。
方案1:分组向量化填充(推荐)
import pandas as pd import numpy as np # 1. 构造示例数据表 df = pd.DataFrame({ 'Master': ['X', 'X', 'X', 'Y', 'Y'], 'ID_A': [1, 2, 3, 4, 5], 'Col_A': ['a', 'g', 't', 'a', 'e'], 'Col_B': [np.nan, 'f', 's', 'd', 'r'], 'Col_C': [np.nan, 'o', 'o', 'c', np.nan] }) # 2. 按Master分组实现填充逻辑 def fill_na_by_group(group): # 取当前分组所有ID_A的升序结果 id_list = sorted(group['ID_A'].tolist()) # 遍历分组内每一行 for idx, row in group.iterrows(): # 筛选排除当前行ID后的可用ID列表 available_ids = [x for x in id_list if x != row['ID_A']] # 按列顺序匹配空值,依次填充可用ID na_cols = row[row.isna()].index.tolist() for col, fill_id in zip(na_cols, available_ids): group.loc[idx, col] = fill_id return group # 3. 应用分组逻辑得到最终结果 df = df.groupby('Master', group_keys=False).apply(fill_na_by_group) print(df)
运行后输出结果完全符合要求:
| Master | ID_A | Col_A | Col_B | Col_C |
|---|---|---|---|---|
| X | 1 | a | 2 | 3 |
| X | 2 | g | f | o |
| X | 3 | t | s | o |
| Y | 4 | a | d | c |
| Y | 5 | e | r | 4 |
方案2:纯逐行循环实现(适合理解逻辑)
如果你需要纯循环的逻辑来学习,可以参考下面的写法:
# 先把表格转成字典列表格式方便逐行操作 data = df.to_dict('records') # 预生成每个Master对应的升序ID列表 master_id_map = {} for row in data: master = row['Master'] if master not in master_id_map: master_id_map[master] = [] master_id_map[master].append(row['ID_A']) for master in master_id_map: master_id_map[master].sort() # 逐行遍历填充 for row in data: current_id = row['ID_A'] master = row['Master'] # 拿到当前行可用的ID(排除自身ID) available_ids = [x for x in master_id_map[master] if x != current_id] ptr = 0 # 按列顺序检查空值填充 for col in ['Col_B', 'Col_C']: if pd.isna(row[col]) and ptr < len(available_ids): row[col] = available_ids[ptr] ptr += 1 # 转回DataFrame格式 df = pd.DataFrame(data)
内容的提问来源于stack exchange,提问作者Filipe Carvalho
相关产品推荐
相关产品推荐

