这是我的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
。那些不是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()
。
我想念什么?谢谢
答案 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}
关于存在太多剩余行的问题,这归结为您将renal
和dialisis
与 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