2 votes

Impossible d'évaluer la colonne pour les valeurs vides

J'ai lu plus de 20 fils de discussion à ce sujet et je n'ai toujours pas trouvé la solution (sans jeu de mots).

J'ai un dataframe pandas df_s, qui a une colonne contenant des dates à iloc[:,8]. Je cherche à ajouter une nouvelle colonne au dataframe avec une valeur (oui/non) basée sur la présence ou non d'une valeur dans l'autre colonne.

Voici ce que j'ai essayé :

CDRFormUp = []
for row in df_s.iloc[:,8]:
    if row=="":
            CDRFormUp.append('Non')
    else:
            CDRFormUp.append('Oui')
df_s['CDR Form Up'] = CDRFormUp

CDRFormUp serait la nouvelle colonne. Je parcours chaque ligne du dataframe, et je vérifie si la valeur dans la colonne est quelque chose.

J'ai essayé...

if row <>"":
if row == "":
if row is None:
if row:
if row>0:

Rien ne fonctionne. La colonne contient des dates, des cellules vides et du texte. Par exemple, la valeur dans cette colonne dans la première ligne est "CDF Form", dans la deuxième ligne elle est vide, dans la troisième ligne c'est "4865" ou quelque chose du genre.

Si je définis l'iloc sur une autre colonne qui contient uniquement des noms de pays, et que je définis la condition sur "Pays = "Italie", cela ajoute correctement "Oui" ou "Non" à la nouvelle colonne pour chaque ligne...ce n'est donc pas un iloc incorrect ou autre chose.

Toute aide serait incroyablement appréciée. Merci !

1voto

Scott Boston Points 48995

Vous devez utiliser np.where avec les dataframes Pandas.

df_s = pd.DataFrame(np.random.randint(1,10,(5,10)))

df_s.iloc[1,8] = ''

df_s.iloc[3,8] = np.nan

df_s['CDRFormUp'] = np.where(df_s.iloc[:,8].mask(df_s.iloc[:,8].str.len()==0).isnull(),'Oui','Non')

print(df_s)

Résultat:

   0  1  2  3  4  5  6  7    8  9 CDRFormUp
0  6  5  5  5  9  3  3  5    3  9        Non
1  5  4  7  3  9  6  8  9       9       Oui
2  5  2  2  7  7  6  3  2    5  2        Non
3  8  2  1  9  7  3  7  8  NaN  8       Oui
4  4  4  1  5  3  5  9  4    4  9        Non

0voto

piRSquared Points 159

Je soupçonne que vous avez des éléments avec des espaces blancs.

Considérez le dataframe df_s

df_s = pd.DataFrame([
    [1, 'a', 'Oui'],
    [2, '', 'Non'],
    [3, ' ', 'Non']
])

df_s

   0  1    2
0  1  a  Oui
1  2      Non
2  3      Non

Les lignes 1 et 2 dans la colonne 1 semblent avoir des chaînes vides. Mais elles ne le sont pas

df_s.iloc[:, 1] == ''

0    False
1     True
2    False
Name: 1, dtype: bool

Vous voudrez peut-être vérifier si la totalité de la chaîne est un espace blanc ou supprimer d'abord les espaces blancs.

Option 1
tout l'espace blanc

df_s.iloc[:, 1].str.match('^\s*$')

0    False
1     True
2     True
Name: 1, dtype: bool

Que nous pouvons convertir en oui/non avec

df_s.iloc[:, 1].str.match('^\s*$').map({True: 'non', False: 'oui'})

0    oui
1     non
2     non
Name: 1, dtype: object

Ajoutez une nouvelle colonne

df_s.assign(
    CDRFormUp=df_s.iloc[:, 1].str.match('^\s*$').map({True: 'non', False: 'oui'})
)

   0  1    2 CDRFormUp
0  1  a  Oui       oui
1  2      Non        non
2  3      Non        non

Option 2
supprimez les espaces blancs puis vérifiez si c'est vide

df_s.iloc[:, 1].str.strip() == ''

0    False
1     True
2     True
Name: 1, dtype: bool

Ajoutez une nouvelle colonne

df_s.assign(
    CDRFormUp=df_s.iloc[:, 1].str.strip().eq('').map({True: 'non', False: 'oui'})
)

   0  1    2 CDRFormUp
0  1  a  Oui       oui
1  2      Non        non
2  3      Non        non

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X