2013-07-17 19 views
16

Mam DataFrame nazwie df jakKonwersja serię pandy zawierający ciąg boolean

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

Chciałbym przekonwertować kolumnę Status do Boolean (True gdy status jest dostarczane i False gdy status jest Undelivered) ale jeśli Status nie jest "Niedostarczony" ani "Dostarczony", należy go uznać za NotANumber lub coś w tym stylu.

Chciałbym użyć dict

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

więc może łatwo dodać inny ciąg znaków, który może być albo uznana za True lub False.

Odpowiedz

27

można po prostu użyć 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

Otrzymuję obiekt "AttributeError:" DataFrame "nie ma atrybutu" map ". –

+0

'map' to metoda w Serii, a nie DataFrame. – joris

+0

Tak, mam to, przepraszam za to. –

4

Masz wszystko, czego potrzebujesz. Będziesz szczęśliwy, aby dowiedzieć się replace:

df.replace(d) 
+0

Ah, widzę tylko to teraz Wysłałem swoją odpowiedź. Czy w tym przypadku występuje różnica z 'mapą'? – joris

+0

Wygląda na to, że coś innego (nie w dift) zostało po prostu z 'replace', ale zostało zamienione na' NaN' z 'map''' – joris

+3

Myślę, że' 'map'' jest tutaj lepszym wyborem, ponieważ jeśli wartość nie znajduje się w '' d'', wtedy wartość jest nieprawidłowa i powinna zostać zastąpiona przez '' NaN''. –

4

Przykładem replace metody zastąpienia wartości tylko w określonej kolumnie C2 i uzyskać wynik jak DataFrame typu.

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

Chociaż ten kod może odpowiedzieć na pytanie, podanie dodatkowego kontekstu dotyczącego tego, w jaki sposób i/lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi. –