确定数据帧每一行的值

时间:2018-10-07 08:06:30

标签: python-3.x pandas dataframe

这是我的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

对于数据帧中的每一行,我想确定renaldialisis中的值是否为NULL。那些不是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 :(得分:3)

有关双重NaN,请参见this question;本质上,它可能是因为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}

关于存在太多剩余行的问题,这归结为您将renaldialisis string '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