Как преобразовать тип данных столбца из 'string' в 'boolean', сохранив NaN? - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть столбец в фрейме данных объекта типа данных, который в основном состоит из множества пропущенных значений в виде NaN и некоторых строк в виде записей «False» и «True».Я хочу преобразовать его в логический тип данных, но записи NaN преобразуются в True.Как сделать это с сохранением значений NaN как есть?

1 - я пробовал метод .astype (), который возвращал значения NaN как True.2. Попытался сначала преобразовать в числовое значение, а затем в логическое значение и получить тот же результат.

# Before conversion

In[]:  ri_df.contraband_weapons.value_counts()
Out[]: False    11296
       True       499
       Name: contraband_weapons, dtype: int64

# After conversion

In[]:  ri_df.contraband_weapons.astype('bool').value_counts()
Out[]: True     498385
       False     11296
       Name: contraband_weapons, dtype: int64

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

После комментария Стеф Я полностью изменил свой ответ:

Если у вас ваш столбец в виде строка 'True' или 'Ложь' , смешанные со значениями NaN , вы можете использовать заменить словарем:

  • заменить строку 'True' с логическим True ,
  • заменить строку 'False' с логическим False .

Что-то вроде:

ri_df.contraband_weapon.replace({'True': True, 'False': False}, inplace=True)

Так что код может быть довольно коротким.

Но плохая новость заключается в том, что тип этого столбца все еще объект .Причина в том, что:

  • большинство значений имеют тип bool ,
  • , но некоторые из них NaN , что на самом делеособый случай float .

Следовательно, среди значений в этом столбце нет никакого «одиночного» типа, поэтому тип не может быть bool .

Редактировать после вопроса об "обходном пути"

Я вижу, что вы хотите сохранить "логику трех значений" ( True / False / Неизвестно ).

Если вы хотите остаться с родными Pandas типами данных, я думаю, что нет никакого обходного пути, потому что:

  • bool имеет значение True или False (не третий вариант, как «неизвестный»),
  • NaN является специальнымcase float ,

, поэтому вам придется жить с этой "смесью типов".

Возможно, какой-то альтернативой является определение Категориального *Тип 1093 *, включая три категории, соответствующие True , False и Unknown и перевод каждого значения источника в соответствующую категорию.

Затем будет single тип данных, но недостатком является то, что если вы хотите иметь какие-либо «3-значные операторы / функции bool», вы должны программировать их самостоятельно.

1 голос
/ 21 сентября 2019

Вы можете использовать eval для преобразования строки 'True' / 'False' в логическое значение True / False и оставить NaN без изменений:

df = pd.DataFrame( {'Col1': ['True', np.nan, 'False']})
df.applymap(type)
#              Col1
#0    <class 'str'>
#1  <class 'float'>
#2    <class 'str'>
df.loc[~df.Col1.isnull(),'Col1'] = df[~df.Col1.isnull()].Col1.map(eval)
df.applymap(type)
#              Col1
#0   <class 'bool'>
#1  <class 'float'>
#2   <class 'bool'>
...