Как я могу сопоставить True / False с 1/0 в Pandas DataFrame?

136

У меня есть столбец в Python pandas DataFrame, который имеет логические значения True / False, но для дальнейших вычислений мне нужно представление 1/0. Есть ли быстрый способ сделать это с помощью pandas / numpy?

Саймон Ригли
источник
1
Какие требуются дальнейшие расчеты?
Джон Клементс
Чтобы попугать @JonClements, зачем вам преобразовывать bool в int для использования в вычислениях? bool работает с арифметикой напрямую (так как внутренне это int).
cs95,

Ответы:

279

Краткий способ преобразования одного столбца логических значений в столбец целых чисел 1 или 0:

df["somecolumn"] = df["somecolumn"].astype(int)
пользователь
источник
4
Угловой случай - если в somecolumn. Используя astype(int)то потерпит неудачу. Другой подход, который преобразуется Trueв 1,0 и False0,0 (с плавающей точкой) при сохранении значений NaN, заключается в следующем:df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
DustByte
@DustByte Хороший улов!
Homunculus Reticulli
@DustByte Не могли бы вы просто использовать astype(float)и получить тот же результат?
AMC
66

Просто умножьте свой Dataframe на 1 (int)

[1]: data = pd.DataFrame([[True, False, True], [False, False, True]])
[2]: print data
          0      1     2
     0   True  False  True
     1   False False  True

[3]: print data*1
         0  1  2
     0   1  0  1
     1   0  0  1
shubhamgoel27
источник
Какие преимущества у этого решения?
AMC
44

Trueнаходится 1в Python, а также Falseявляется 0* :

>>> True == 1
True
>>> False == 0
True

Вы должны быть в состоянии выполнять любые операции , которые вы хотите на них, просто рассматривая их , как если бы они были числами, так как они являются номерами:

>>> issubclass(bool, int)
True
>>> True * 5
5

Итак, чтобы ответить на ваш вопрос, никакой работы не требуется - у вас уже есть то, что вы ищете.

* Обратите внимание, что я использую это как английское слово, а не ключевое слово Python is- Trueэто не тот же объект, что и любой случайный 1.

Гарет Латти
источник
2
Просто будьте осторожны с типами данных, если выполняете математику с плавающей запятой: np.sin(True).dtypeдля меня это float16.
jorgeca
9
У меня есть фреймворк с логическим столбцом, и я могу df.my_column.mean()нормально звонить (как вы подразумеваете), но когда я пытаюсь: df.groupby("some_other_column").agg({"my_column":"mean"})я получаю DataError: No numeric types to aggregate, поэтому кажется, что они НЕ всегда одинаковы. Просто к вашему сведению.
dwanderson
В pandas версии 24 (и, возможно, ранее) вы можете легко агрегировать boolстолбцы.
BallpointBen
1
Похоже, что numpy также выдает ошибки с логическими типами: TypeError: numpy boolean subtract, the оператор -` устарел, используйте вместо него bitwise_xor, ^оператор или функцию logic_xor. `Использование ответа @ User исправляет это.
Амаду Коне
Другая причина, по которой это не то же самое: df.col1 + df.col2 + df.col3 не работает для boolстолбцов, как для intстолбцов
colorlace
22

Вы также можете сделать это прямо во фреймах

In [104]: df = DataFrame(dict(A = True, B = False),index=range(3))

In [105]: df
Out[105]: 
      A      B
0  True  False
1  True  False
2  True  False

In [106]: df.dtypes
Out[106]: 
A    bool
B    bool
dtype: object

In [107]: df.astype(int)
Out[107]: 
   A  B
0  1  0
1  1  0
2  1  0

In [108]: df.astype(int).dtypes
Out[108]: 
A    int64
B    int64
dtype: object
Джефф
источник
2

Вы можете использовать преобразование для своего фрейма данных:

df = pd.DataFrame(my_data condition)

преобразование True / False в 1/0

df = df*1
Бруно Беневидес
источник
Это идентично этому решению , опубликованному 3 года назад.
AMC
1

Используйте Series.viewдля преобразования логических значений в целые числа:

df["somecolumn"] = df["somecolumn"].view('i1')
jezrael
источник