Skip to main content
 首页 » 编程设计

python之fillna() with map(dict) 不仅填充 NaN,还填充所有值

2024年08月14日38JeffreyZhao

我有一个名为 data 的 DataFrame,其中包含一些列。其中之一是 Married,另一个是 Gender。这两个变量都是分类变量。

>>> print(data[['Gender', 'Married']].dtypes) 
Gender     category 
Married    category 
dtype: object 

Married 不包含 NaN 值,但是 Gender 包含 12 个 NaN 值,我想要的归咎于。

>>> print(data['Gender'].isna().sum()) 
12 

我做了快速分析,如果你有 Married='Yes',那么你更有可能有 Gender='Male'。所以我想以这种方式估算 Gender 值:

Married='Yes' ->  Gender='Male' 
Married='No'  ->  Gender='Female' 

所以我创建了一个字典:

dictionary = {'Yes': 'Male', 'No': 'Female'} 

然后我根据fillna()写了一段简单的代码:

data['Gender'].fillna(data['Married'].map(dictionary), inplace=True) 

而且它起作用了……以完全不同于预期的方式。它改变了整个 Gender 列!现在每个条目都基于 Married 列。看看这些交叉表:

在 fillna() 之前:

Married   No  Yes 
Gender            
Female    80   31 
Male     129  352 

在 fillna() 之后:

Married   No  Yes 
Gender            
Female   212    0 
Male       0  392 

如何根据 Married 列填充 NaN Gender 值?

请您参考如下方法:

您的代码看起来不错。如果它不起作用,则可能存在 Pandas 错误。您可以尝试使用 bool 索引代替 loc 赋值:

mask = df['Gender'].isnull() 
df.loc[mask, 'Gender'] = df.loc[mask, 'Married'].map(dictionary)