DataFrame每行数值的确定

3

这是我的数据框:

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

我希望确定DataFrame中每一行的renaldialisis值是否为NULL。那些不是NULL的行将在survived列表中赋值为1;而如果它们都是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}

我使用了set(),应该返回NAN,但是没有。我错过了什么吗?谢谢。
1个回答

3

关于双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}

关于有过多幸存行的问题,这归结于您将 renaldialisis字符串 'nan' 进行比较,而不是与 浮点数 np.nan 进行比较。您可以直接使用 np.nan 进行相等比较或使用 np.isnan 进行比较。
但请注意,惯用的 pandas(和 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

非常好的解释。我希望更多的Pandas答案都像这样! - jpp
除此之外,我感觉对set的重复调用意味着应该删除重复项。结合这个答案和一个简单的df.groupby("Numero").survived.max()就可以实现这一点。 - coffeinjunky
@coffeinjunky:不确定这是否是您的意思,但 set(set(np.array([np.nan, np.nan]))) 有两个元素。 - fuglede
这只是对楼主的一种提醒,而不是对你的解决方案的评论。从原始代码来看,他/她想要每个患者ID(numero)作为结果的一行,而不是(如所写)每个原始行作为一行。我可能错了。只是想指出他/她如何实现这一点。 - coffeinjunky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接