我有一个名为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
如何填充基于Gender
列的NaN Married
个值?
答案 0 :(得分:2)
您可以使用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)
答案 1 :(得分:1)
您的代码看起来不错。如果不起作用,则可能是熊猫错误。您可以尝试使用布尔索引来进行loc
分配:
mask = df['Gender'].isnull()
df.loc[mask, 'Gender'] = df.loc[mask, 'Married'].map(dictionary)