Je dois vérifier si une série existe déjà en tant que ligne dans le dataframe. Le dataframe est le suivant:

        Name   Age   University
0      Ankit   NaN          BHU
1  Aishwarya  21.0          JNU
2    Shaurya  22.0           DU

J'ai essayé-

(df == ser).all(1).any()

Cela fonctionne correctement lorsque la trame de données et la série n'ont pas de valeurs nulles. Par exemple, si la série est ['Aishwarya', 21.0, 'JNU'], la sortie est True , ce qui est correct. Cependant, si la série est ['Ankit', np.nan, 'BHU'], la sortie est False même si la série existe dans le dataframe.

Exemple minimal reproductible -

details = {'Name':['Ankit', 'Aishwarya', 'Shaurya'], 'Age':[np.nan, 21, 22], 'University':['BHU', 'JNU', 'DU']}
df = pd.DataFrame(details, columns = ['Name', 'Age', 'University']) 

ser1 = pd.Series(['Ankit', np.nan, 'BHU'], index = ['Name', 'Age', 'University'])
ser2 = pd.Series(['Aishwarya', 21.0, 'JNU'], index = ['Name', 'Age', 'University'])

print((ser1 == df).all(1).any())
print((ser2 == df).all(1).any())

Sortie réelle-

False
True

Production attendue-

True
True
1
Shradha 6 nov. 2020 à 00:53

2 réponses

Meilleure réponse

Par définition np.nan == np.nan est faux

Essayez d'utiliser df.isin() à la place:

df.isin([*ser1]).all(1).any()
True
1
jlb_gouveia 6 nov. 2020 à 12:11

J'ai trouvé une réponse ici.

print(ser1.astype(str).eq(df.astype(str)).all(1).any())  # True
print(ser2.astype(str).eq(df.astype(str)).all(1).any())  # True
0
Shradha 6 nov. 2020 à 11:55