Столбец Python для замены строковых логических значений на фактический логический тип - PullRequest
0 голосов
/ 19 сентября 2019

Я хочу заменить строковый логический тип, присутствующий внутри столбца, на фактические логические значения.

kdf = pd.DataFrame(data={'col1' : [True, 'True', np.nan], 'dt': [datetime.now(), ' 2018-12-12', '2019-12-12'], 'bool': 
                     [False, True, True], 'bnan': [False, True, np.nan]})

поэтому здесь я хочу преобразовать True (индекс 1 для col1) в фактический логический типTrue.Я сделал следующее:

kdf.loc[kdf['col1'].str.contains('true', na=False, case=False)] = True
kdf.loc[kdf['col1'].str.contains('false', na=False, case=False)] = False

, который преобразует значения столбца в фактический тип, но мне нужно создать функцию, которая принимает только столбец df, выполняет внутреннюю замену и возвращает измененный столбец.(как col.fillna).Обратите внимание, что нам не разрешено передавать весь df в эту функцию.Так что я не могу использовать df.loc.

Также я немного беспокоюсь о производительности, есть ли другой способ?

Ответы [ 3 ]

1 голос
/ 19 сентября 2019
df['col'] = df['col'].apply(lambda x: True if x == 'true' else False)

Я думаю, что вышеупомянутое должно работать.

Надеюсь, это поможет!

0 голосов
/ 19 сентября 2019

Расширение решения @ 89f3a1c и комментария @ AvinashRaj:

Мы вводим в данные следующие проблемы с данными.
1. Строка 'True' заменена на ' true '.Это приводит к несоответствию регистра и пробелам в начале и в конце.

import pandas as pd
from datetime import datetime

kdf = pd.DataFrame(data={'col1' : [True, ' true  ', np.nan], 
                         'dt': [datetime.now(), ' 2018-12-12', '2019-12-12'], 
                         'bool': [False, True, True], 
                         'bnan': [False, True, np.nan]})

kdf['col1'] = kdf['col1'].apply(lambda x: True if str(x).strip() in ['true','True'] else False)

Кадр данных :

    col1    dt  bool    bnan
0   True    2019-09-19 03:22:06.734861  False   False
1   true    2018-12-12 00:00:00.000000  True    True
2   NaN 2019-12-12 00:00:00.000000  True    NaN

Вывод :

    col1    dt  bool    bnan
0   True    2019-09-19 03:26:47.611914  False   False
1   True    2018-12-12 00:00:00.000000  True    True
2   False   2019-12-12 00:00:00.000000  True    NaN
0 голосов
/ 19 сентября 2019

Почему бы не использовать replace

df.replace({'True':True,'False':False})
# df.replace({'True':True,'False':False}).applymap(type)
Out[123]: 
              bnan            bool             col1             dt
0   <class 'bool'>  <class 'bool'>   <class 'bool'>  <class 'str'>
1   <class 'bool'>  <class 'bool'>   <class 'bool'>  <class 'str'>
2  <class 'float'>  <class 'bool'>  <class 'float'>  <class 'str'>

Обновление

df.replace({'True':True,'False':False},regex=True).applymap(type)

Пример уведомления о данных Я добавил начальные и конечные пробелы

df = pd.DataFrame(data={'col1' : [True, ' True', np.nan], 'dt': [' 2018-12-12', ' 2018-12-12', '2019-12-12'], 'bool': 
                     [False, True, True], 'bnan': ['False  ', True, np.nan]})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...