fillna () с картой (dict) заполняет не только NaN, но и все значения - PullRequest
0 голосов
/ 25 января 2019

У меня есть DataFrame с именем 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. Посмотрите на эти кросс-таблицы:

До заполнения () :

Married   No  Yes
Gender           
Female    80   31
Male     129  352

После заполнения () :

Married   No  Yes
Gender           
Female   212    0
Male       0  392

Что можно сделать, чтобы заполнить значения NaN Gender на основе столбца Married?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вы можете использовать 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)
0 голосов
/ 25 января 2019

Ваш код выглядит нормально. Если это не работает, возможно, есть ошибка Pandas. Вместо этого вы можете попробовать присвоение loc с логическим индексированием:

mask = df['Gender'].isnull()
df.loc[mask, 'Gender'] = df.loc[mask, 'Married'].map(dictionary)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...