2013-07-17 4 views
16

У меня есть DataFrame имени df вПреобразование серии панды, содержащей строку булева

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

Я хотел бы преобразовать Status столбец булева (True, когда статус поставляется и False когда статус Недоставленный) но если Статус не является «Undelivered», а «Delivered» его следует рассматривать как NotANumber или что-то в этом роде.

Я хотел бы использовать Dict

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

, так что я мог бы легко добавить другую строку, которая может быть либо рассматриваться как True или False.

ответ

27

Вы можете просто использовать 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 get 'AttributeError: объект DataFrame не имеет атрибута 'map''. –

+0

'map' - это метод на Series, а не DataFrame. – joris

+0

да, извините за это. –

4

У вас есть все, что вам нужно. Вы будете рады обнаружить replace:

df.replace(d) 
+0

А, я только вижу, теперь я отправил свой ответ. Есть ли разница с 'map' в этом случае? – joris

+0

Кажется, что что-то еще (а не в dift) просто осталось с 'replace', но преобразовано в' NaN' с 'map' – joris

+3

Я думаю, что' 'map'' - лучший выбор здесь, фактически, потому что если значение не находится в '' d'', тогда значение является недопустимым и должно быть заменено на '' NaN''. –

4

В качестве примера replace способа заменить значения только в указанном столбце C2 и получить результат в виде DataFrame типа.

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

Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа. –