J'ai un bloc de données comme celui-ci,
0 False 1 True 2 True 3 False 4 False Name: ID, dtype: bool
À partir du cadre de données ci-dessus, je souhaite extraire les lignes 0 à 4 et vérifier s'il y a des valeurs dans la colonne 'ID' a un NaN . J'ai essayé ceci,
df.iloc[rows_needed,0].isnull()
Mais j'obtiens ce qui suit,
[0, 1, 2, 3, 4]
Je m'attends à obtenir les index de [1,2] . Comment puis-je obtenir la sortie souhaitée?
Quand je fais cela,
rows_needed = [0,1,2,3,4] df.iloc[rows_needed,0].isnull().index.tolist()
J'obtiens,
ID Cus_ID cl_id 0 5.0 200 0 1 NaN 200 0 2 NaN 200 1 3 14.0 200 2 4 15.0 200 2 5 16.0 200 2 6 NaN 200 3
Je ne sais pas où je suis faire l'erreur de ne pas obtenir ma sortie.
4 Réponses :
Vous êtes très très proche, il vous suffit d'enchaîner .iloc et .loc avec un == TRUE pour obtenir votre résultat
your_indices = (df.iloc[rows_needed]
.loc[df.ID.isnull()==True]
.index.tolist())
print(your_indices)
[1, 2]
Laissons le chaîner loc ne sélectionnera que le rendement du résultat True out
rows_needed = [0,1,2,3,4] df.iloc[rows_needed,0].isnull().loc[lambda x : x].index.tolist() Out[240]: [1, 2]
Je t'ai battu pour une fois :), gentil avec le lambda je n'aurais pas pensé à ça.
@Datanovice ah :-) .loc est une petite astuce pour chaîner ce type de fonctions :-)
Deux étapes pour plus de clarté. Tranche, puis masque en fonction de cette tranche.
[1, 2]
u = df.iloc[rows_needed, 0] u[u.isnull()].index.tolist()
Vous pouvez utiliser index.symmetric_different avec dropna pour trouver que cet index n'est pas NaN comme suit:
(df.iloc[rows_needed,0].dropna().index ^ rows_needed).tolist() Out[684]: [1, 2]
ou
df.iloc[rows_needed,0].dropna().index.symmetric_difference(rows_needed).tolist()