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

如何基于PClass和Sex分组中位数填充DataFrame的Age缺失值

基于分组中位数填充DataFrame中的缺失值

问题场景

你已通过pd.DataFrame(df.groupby(['PClass', 'Sex'])['Age'].median())得到按PClass和Sex分组的Age中位数(即示例中的multiindex_df),需要用这些中位数填充另一个含Age缺失值的DataFrame(示例中的df)的缺失值,得到目标结果。

解决方案

以下提供三种实用方法,适配不同数据规模和需求:


方法1:Merge合并后填充(直观易理解)

通过合并分组中位数数据与原缺失值数据,用中位数列填充缺失值:

import numpy as np
import pandas as pd

# 构造分组中位数数据(对应Groupby results)
mldx_arrays = [np.array([1, 1, 2, 2, 3, 3]),
               np.array(['male', 'female', 'male', 'female', 'male', 'female'])]
multiindex_df = pd.DataFrame(
    [34,29,24,40,18,25], index=mldx_arrays, columns=['Age']
)
multiindex_df.index.names = ['PClass', 'Sex']

# 构造含缺失值的DataFrame(对应Missing Data)
d = {'PClass': [1, 1, 2, 2, 3, 3], 
     'Sex': ['male', 'female', 'male', 'female', 'male', 'female'], 
     'Age': [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]}
df = pd.DataFrame(data=d)

# 重置分组中位数的索引,转为普通列便于合并
median_df = multiindex_df.reset_index()
# 按PClass和Sex合并两个DataFrame
merged_df = df.merge(median_df, on=['PClass', 'Sex'], suffixes=('_original', '_median'))
# 用中位数填充原Age的缺失值
merged_df['Age_original'] = merged_df['Age_original'].fillna(merged_df['Age_median'])
# 整理结果,删除临时列并重命名
result_df = merged_df.rename(columns={'Age_original': 'Age'}).drop('Age_median', axis=1)
print(result_df)

方法2:Apply+Map匹配多索引(代码简洁)

利用多索引的特性,将PClass和Sex组成元组,直接匹配分组中位数:

# 基于原示例代码,直接填充缺失值
df['Age'] = df.apply(
    lambda row: multiindex_df.loc[(row['PClass'], row['Sex']), 'Age'] 
    if pd.isna(row['Age']) else row['Age'],
    axis=1
)
print(df)

方法3:索引对齐批量填充(适合大型DataFrame)

针对大型数据集,通过设置多索引实现批量填充,效率远高于逐行操作:

# 将原DataFrame设置为与分组中位数一致的多索引
df = df.set_index(['PClass', 'Sex'])
# 利用索引对齐,直接用中位数填充缺失值
df['Age'] = df['Age'].fillna(multiindex_df['Age'])
# 重置索引恢复原结构
df = df.reset_index()
print(df)

方法对比

  • 方法1:适合需要保留中间数据、便于调试的场景,逻辑清晰。
  • 方法2:代码短但逐行处理,小数据量适用,大型数据效率较低。
  • 方法3:基于Pandas索引对齐机制,批量操作效率最高,优先推荐用于大型DataFrame。

内容的提问来源于stack exchange,提问作者Armando Bridena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:50:39