Python Pandas如何按ObjectID分组用同组已知值替换NaN?
简便实现方案
你可以直接用 Pandas 分组后的 transform 方法实现需求,只需要一行核心代码就能完成填充,完全不需要写循环,性能和可读性都好很多:
import pandas as pd import numpy as np # 示例数据 sample_frame = {'UniqueID': [1,2,3,4,5,6,7],"PersonID": [3,2,2,5,5,4,4], "Name": ["Alice",np.nan,"Bob","Joe","Joe",np.nan,np.nan]} sample_frame = pd.DataFrame(data = sample_frame) # 核心填充逻辑 sample_frame['Name'] = sample_frame.groupby('PersonID')['Name'].transform('first')
逻辑说明
- 按
PersonID分组后,transform('first')会自动取每个分组里第一个非空的Name值,组内所有行统一返回该值 - 如果某个分组所有
Name都是空值,会直接返回NaN,符合不需要处理的要求 - 由于你明确说明该变量取值仅和对象相关,同一个
PersonID下的非空值一定一致,所以用'first'、'last'都可以得到正确结果。如果存在特殊场景同个ID下有多个不同非空值,可替换为取众数的逻辑:transform(lambda x: x.mode()[0] if x.notna().any() else np.nan) - 如果需要批量处理多个同规则填充的列,直接替换列名部分即可,示例:
# 同时填充Name、Age、Gender三列 fill_cols = ['Name', 'Age', 'Gender'] sample_frame[fill_cols] = sample_frame.groupby('PersonID')[fill_cols].transform('first')
结果验证
运行后sample_frame的Name列会变成:["Alice", "Bob", "Bob", "Joe", "Joe", np.nan, np.nan],完全符合预期。
内容的提问来源于stack exchange,提问作者Oliver F
相关产品推荐
相关产品推荐

