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

如何使用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)

运行后输出结果完全符合要求:

MasterID_ACol_ACol_BCol_C
X1a23
X2gfo
X3tso
Y4adc
Y5er4

方案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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:24:06