繁体   English   中英

使用map(dict)的fillna()不仅可以填充NaN,还可以填充所有值

[英]fillna() with map(dict) fills not only NaNs, but all values

我有一个数据帧称为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值?

你可以使用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)

您的代码看起来不错。 如果不起作用,则可能是熊猫错误。 您可以尝试使用loc分配位置:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM