2013-07-17 20 views
16

ho un dataframe nominato df comeConvertire serie Pandas contenente stringa boolean

Order Number  Status 
1   1668 Undelivered 
2  19771 Undelivered 
8 Undelivered 
4   2229 Delivered 
5  00056 Undelivered 

vorrei convertire la colonna Status a booleani (True quando viene consegnato Stato e False quando lo stato è non consegnato) ma se Lo stato non è né "Non consegnato", né "Consegnato" deve essere considerato come NotANumber o qualcosa del genere.

desidero utilizzare un dict

d = { 
    'Delivered': True, 
    'Undelivered': False 
} 

così ho potuto facilmente aggiungere altra stringa che potrebbe essere sia considerato come True o False.

risposta

27

Si può semplicemente utilizzare map:

In [7]: df = pd.DataFrame({'Status':['Delivered', 'Delivered', 'Undelivered', 
            'SomethingElse']}) 

In [8]: df 
Out[8]: 
      Status 
0  Delivered 
1  Delivered 
2 Undelivered 
3 SomethingElse 

In [9]: d = {'Delivered': True, 'Undelivered': False} 

In [10]: df['Status'].map(d) 
Out[10]: 
0  True 
1  True 
2 False 
3  NaN 
Name: Status, dtype: object 
+0

im ottenere 'AttributeError: L'oggetto 'DataFrame' non ha attributo 'map''. –

+0

'map' è un metodo sulla serie, non DataFrame. – joris

+0

sì, ci siamo pentiti. –

4

Hai tutto ciò di cui hai bisogno. Sarete felici di scoprire replace:

df.replace(d) 
+0

Ah, l'ho visto solo ora ho postato la mia risposta. C'è una differenza con 'map' in questo caso? – joris

+0

Sembra che qualcos'altro (non nel dift) sia lasciato con 'replace', ma convertito in' NaN' con 'map' – joris

+3

Penso che' 'map'' sia una scelta migliore qui, in realtà, perché se un valore non è in '' d'', quindi il valore non è valido e deve essere sostituito con '' NaN''. –

4

Un esempio di replace metodo per sostituire solo i valori nella colonna specificata C2 e ottenere il risultato come DataFrame tipo.

import pandas as pd 
df = pd.DataFrame({'C1':['X', 'Y', 'X', 'Y'], 'C2':['Y', 'Y', 'X', 'X']}) 

    C1 C2 
0 X Y 
1 Y Y 
2 X X 
3 Y X 

df.replace({'C2': {'X': True, 'Y': False}}) 

    C1  C2 
0 X False 
1 Y False 
2 X True 
3 Y True 
+1

Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo su come e/o perché risolve il problema migliorerebbe il valore a lungo termine della risposta. –

Problemi correlati