2017-10-21 109 views
1

J'ai une dataframe 'df' avec la colonne df ['dead_notdead'] qui a des valeurs comme [{'out'}, {'out', 'tremper'}. ....] Je veux créer une colonne nommée df ['Fatal'] et si la valeur de df ['dead_notdead'] est vide alors df ['Fatal'] devrait être 0 sinon 1.Comment mettre à jour une nouvelle colonne basée sur une colonne existante en Python

format de fichier taille df 16343

Input 
    index  Dead_notdead 
    0   {'out'} 
    1   {} 
    2   {'out','shock,'kill'} 

Output 
    index Dead_notdead    Fatal 
    0  {'out'}     1 
    1  {}      0 
    2  {'out','shock','kill'} 1 

Code essayé:

k=df['Dead_notdead'] 
s=[] 

for (i in range(len(k)): 
    if(len(k)==2): 
    s.append(0) 
    else: 
    s.append(1) 

T son est de donner une error.Overall inconnue ce qui est nécessaire à la nouvelle colonne doit avoir 1 si k a une valeur autre 0.

Répondre

1

Option 1
piRSquared's improvement consiste à exploiter le falseyness des ensembles.

df['Fatal'] = df['Dead_notdead'].astype(bool).astype(int) 

Cela fonctionne parce que {} se traduit False!


Option 2
Vous pouvez appeler str.len et convertir le masque booléen résultant à un type entier en utilisant astype.

df['Fatal'] = df['Dead_notdead'].str.len().gt(0).astype(int) 

Si vous avez une colonne de chaînes (pas set objets), le convertir d'abord, en utilisant ast:

import ast 
df['Dead_notdead'] = df['Dead_notdead'].apply(ast.literal_eval) 
+0

@JonClements Oops, il majeure faute de frappe. –

+0

Vous ne voulez pas un '.map (bool) .astype (int)' quelque part là? –

+0

@JonClements '.gt (0)' = ('> 0') génère un masque booléen, qui est ensuite converti en une colonne de' 0s/1s' en utilisant jstype. –

0

vous pouvez mettre cette logique dans une compréhension de la liste. Il crée une liste qui peut être transmise dans la nouvelle colonne comme une série.

df['Fatal'] = [1 if len(item) > 0 else 0 for item in df.Dead_notdead]