如何通过其他列过滤对指定列执行fillna()空值填充?
用同姓氏行的有效值填充缺失列
你可以通过Pandas的分组(groupby)结合填充方法实现需求,核心是按Last Name分组,用组内的有效值填充对应列的缺失值,以下是两种常用实现方式:
方法一:用组内首个有效值填充
如果同姓氏组内的Cabin/Destination值唯一,直接取组内第一个非空值填充所有缺失:
import pandas as pd # 假设你的数据集存储在df中 # 填充Cabin列 df['Cabin'] = df.groupby('Last Name')['Cabin'].transform( lambda x: x.fillna(x.dropna().iloc[0]) if not x.dropna().empty else x ) # 填充Destination列 df['Destination'] = df.groupby('Last Name')['Destination'].transform( lambda x: x.fillna(x.dropna().iloc[0]) if not x.dropna().empty else x )
逻辑说明:
groupby('Last Name')将相同姓氏的行归为一组transform确保返回结果与原DataFrame长度一致,不打乱行顺序- 先判断组内是否存在非空值,存在则用首个非空值填充组内缺失,否则保留原缺失
方法二:组内前后向填充(适用于组内有多个有效值的场景)
如果同姓氏组内的有效值分布在不同行,可先前向填充(用前面的有效值填后面的缺失),再后向填充(用后面的有效值填前面的缺失),确保组内所有缺失都被覆盖:
df[['Cabin', 'Destination']] = df.groupby('Last Name')[['Cabin', 'Destination']].apply( lambda x: x.ffill().bfill() )
逻辑说明:
ffill()会把组内前一行的有效值填充到当前行的缺失bfill()反向填充,把组内后一行的有效值填充到当前行的缺失- 两者结合可覆盖组内所有位置的缺失,前提是组内至少有一个有效值
注意事项
- 如果某个
Last Name组内的目标列全为缺失值,上述方法会保留这些缺失(无有效值可用) - 若组内存在多个不同的有效值,方法一取首个值,方法二会按行顺序填充,可根据实际业务需求选择
内容的提问来源于stack exchange,提问作者Henry Huynh Pham
相关产品推荐
相关产品推荐

