3
votes

Obtenir l'index des valeurs NaN à partir d'un ensemble sélectionné de lignes

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.


0 commentaires

4 Réponses :


6
votes

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]


0 commentaires

3
votes

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]


2 commentaires

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 :-)



4
votes

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()


0 commentaires

1
votes

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()


0 commentaires