fillna() with map(dict) 不仅填充 NaN,而且填充所有值



我有一个名为data的数据帧,其中包含一些列。其中一个是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值?

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

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

您可以使用 np.select ,它根据条件的结果从choicelist返回值:

n = df.Gender.isna()
m1 = n & (df.Married == 'Yes')
m2 = n & (df.Married == 'No')
np.select([m1,m2], ['Male','Female'], default=df.Gender)

最新更新