Определение значений для каждой строки в DataFrame - PullRequest
0 голосов
/ 07 октября 2018

вот мой DataFrame

Tipo    Número  renal   dialisis
CC  260037  NULL    NULL
CC  260037  NULL    AAB
CC  165182  NULL    NULL
CC  165182  NULL    CCDE
CC  260039  NULL    NULL
CC  49740   XYZ NULL
CC  260041  NULL    NULL
CC  259653  NULL    NULL

Я хочу определить, являются ли значения в renal и dialisis NULL или нет, для каждой строки в DataFrame.Те строки, которые не NULL, будут 1 в survived списке;и если они оба NULL будут 0.Мой код:

survival = pd.read_table('Sophia_Personalizado bien.txt',encoding='utf-16')
survived = []
numero_paciente = []
lista_pacienytes= survival['Número'].values.tolist()
lista_pacienytes= sorted(set(lista_pacienytes))


for e in lista_pacienytes:
    survival_i = survival.loc[survival['Número']==e]
    renal = set(survival_i['renal'].values.tolist())
    dialisis = set(survival_i["dialisis"].values.tolist())

    print('dialisis',dialisis)
    print('renal',renal)

    if renal == 'nan' or dialisis == 'nan':
        survived.append(0)
        numero_paciente.append(e)
    else:
        survived.append(1)
        numero_paciente.append(e)

e = pd.DataFrame({'numero': numero_paciente,
                  'survival': survived})

Удивительно, но все строки равны 1, но, как мы видим в DataFrame, это не так.Кроме того, результат

print('dialisis',dialisis)
print('renal',renal)

:

dialisis {nan, nan}
renal {nan}

, который должен быть NAN, поскольку я использую set().Что мне не хватает?Спасибо

1 Ответ

0 голосов
/ 07 октября 2018

Для двойных 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...