2017-09-30 12 views
0

Voici un instantané des données CSV, file.Remplacer les valeurs de colonne par 0 ou 1 en fonction de NaN

Je veux remplacer la valeur nulle, ou « nan », les valeurs avec un 0 et remplacer toutes les autres entrées avec un 1 dans la colonne « Mort Année »:

import pandas as pd 
import numpy as np 
mydata_csv = pd.read_csv('D:\Python\character-deaths.csv',sep = ',',encoding = 'utf-8') 
mydata_csv 
del mydata_csv['Book of Death'] 
del mydata_csv['Death Chapter'] 

if mydata_csv['Death Year'] == np.nan: 
mydata_csv['Death Year'] = 0 
else: 
mydata_csv['Death Year'] = 1 

Le code ci-dessus produit l'erreur suivante :
ValueError: La valeur de vérité d'une série est ambiguë. Utilisez a.empty, a.bool(), a.item(), a.any() ou a.all().

+0

Très fréquent. Qu'en est-il des autres réponses qui couvrent cela ne s'applique pas ici? https: // stackoverflow.com/q/36921951/1531971 – jdv

Répondre

2

Vous avez deux problèmes:

  1. Une opération logique sur une série/dataframe ne donne pas un résultat scalaire. Il donne un vecteur, que if ne peut pas comprendre.

  2. NaN != NaN; votre condition if ne sera jamais vraie, même si les colonnes sont .

    In [9]: np.nan == np.nan 
    Out[9]: False 
    

Il suffit d'utiliser np.where.

mydata_csv['Death Year'] = np.where(mydata_csv['Death Year'].isnull(), 0, 1) 

Une autre amélioration que je vous recommande est d'utiliser df.drop lors de la suppression des colonnes. Au lieu de del, essayez la version plus pandaic:

mydata_csv = mydata_csv.drop(['Book of Death', 'Death Chapter'], 1) 
0

Vous n'avez pas spécifié quelle ligne, mais je pense que votre problème est dans

if mydata_csv['Death Year'] == np.nan: 

Si donc essayez de vérifier si si la colonne ont des données Tout d'abord, quelque chose le long des lignes de

if mydata_csv['Death Year'] is not None and mydata_csv['Death Year'] == np.nan: 

espoir qui aide

+0

Cela ne va pas aider. C'est incorrect. –

0

Je pense bette r est d'utiliser notnull pour masque booléen puis jeté à int ->True est 1 et False est 0:

Pour travailler avec missing data est d'utiliser des fonctions spéciales nécessaires comme isnull ou notnull, consultez docs pour plus d'informations.

#omit `sep=','` because default parameter 
mydata_csv = pd.read_csv('D:\Python\character-deaths.csv', encoding = 'utf-8') 
#simplify double del 
mydata_csv = mydata_csv.drop(['Book of Death', 'Death Chapter'], axis=1) 
mydata_csv['Death Year'] = mydata_csv['Death Year'].notnull().astype(int) 

Exemple:

mydata_csv = pd.DataFrame({'Book of Death':[4,5,4,5,5,4], 
          'Death Chapter':[7,8,9,4,2,3], 
          'Death Year':[np.nan,3,5,np.nan,1,0], 
          'col':[7,8,9,4,2,3]}) 

print (mydata_csv) 
    Book of Death Death Chapter Death Year col 
0    4    7   NaN 7 
1    5    8   3.0 8 
2    4    9   5.0 9 
3    5    4   NaN 4 
4    5    2   1.0 2 
5    4    3   0.0 3 

mydata_csv = mydata_csv.drop(['Book of Death', 'Death Chapter'], axis=1) 
mydata_csv['Death Year'] = mydata_csv['Death Year'].notnull().astype(int) 
print (mydata_csv) 
    Death Year col 
0   0 7 
1   1 8 
2   1 9 
3   0 4 
4   1 2 
5   1 3