Для двойных NaN см. этот вопрос ;по сути это может произойти из-за np.nan != np.nan
, но это не согласовано:
In [75]: set(np.array([np.nan, np.nan]))
Out[75]: {nan, nan}
In [76]: set([np.nan, np.nan])
Out[76]: {nan}
Что касается вопроса о наличии слишком большого числа сохранившихся строк, то это сводится к тому, что вы сравниваете renal
и dialisis
в строку 'nan'
вместо float np.nan
.Вы можете либо сравнить с равенством непосредственно с np.nan
, либо использовать для этого np.isnan
.
Обратите внимание, однако, что идиоматические панды (и NumPy в этом отношении) обычно заставляют вас выполнять операции один столбец завремя, когда это возможно, вместо того, чтобы выбирать values
и повторять их, так что в вашем случае то, что вы ищете, также может быть получено с помощью следующего:
In [66]: df['survived'] = ~(df.renal.isnull() & df.dialisis.isnull())
In [67]: df
Out[67]:
Tipo Número renal dialisis survived
0 CC 260037 NaN NaN False
1 CC 260037 NaN AAB True
2 CC 165182 NaN NaN False
3 CC 165182 NaN CCDE True
4 CC 260039 NaN NaN False
5 CC 49740 XYZ NaN True
6 CC 260041 NaN NaN False
7 CC 259653 NaN NaN False
Здесь альтернативный способполучить то же самое можно было бы применить isnull
к обоим столбцам одновременно, через ~df[['renal', 'dialisis']].isnull().all(axis=1)
.
Если вы действительно предпочитаете иметь 0 и 1 вместо:
In [71]: df['survived'] = df['survived'].astype(int)
In [72]: df
Out[72]:
Tipo Número renal dialisis survived
0 CC 260037 NaN NaN 0
1 CC 260037 NaN AAB 1
2 CC 165182 NaN NaN 0
3 CC 165182 NaN CCDE 1
4 CC 260039 NaN NaN 0
5 CC 49740 XYZ NaN 1
6 CC 260041 NaN NaN 0
7 CC 259653 NaN NaN 0