Как я могу сопоставить True / False с 1/0 в Pandas DataFrame?
136
У меня есть столбец в Python pandas DataFrame, который имеет логические значения True / False, но для дальнейших вычислений мне нужно представление 1/0. Есть ли быстрый способ сделать это с помощью pandas / numpy?
Чтобы попугать @JonClements, зачем вам преобразовывать bool в int для использования в вычислениях? bool работает с арифметикой напрямую (так как внутренне это int).
cs95,
Ответы:
279
Краткий способ преобразования одного столбца логических значений в столбец целых чисел 1 или 0:
Угловой случай - если в 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
0120TrueFalseTrue1FalseFalseTrue[3]:print data*101201011001
Trueнаходится 1в Python, а также Falseявляется 0* :
>>>True==1True>>>False==0True
Вы должны быть в состоянии выполнять любые операции , которые вы хотите на них, просто рассматривая их , как если бы они были числами, так как они являются номерами:
>>> issubclass(bool, int)True>>>True*55
Итак, чтобы ответить на ваш вопрос, никакой работы не требуется - у вас уже есть то, что вы ищете.
* Обратите внимание, что я использую это как английское слово, а не ключевое слово Python is- Trueэто не тот же объект, что и любой случайный 1.
Просто будьте осторожны с типами данных, если выполняете математику с плавающей запятой: 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
0TrueFalse1TrueFalse2TrueFalseIn[106]: df.dtypes
Out[106]:
A bool
B bool
dtype: object
In[107]: df.astype(int)Out[107]:
A B
010110210In[108]: df.astype(int).dtypes
Out[108]:
A int64
B int64
dtype: object
Ответы:
Краткий способ преобразования одного столбца логических значений в столбец целых чисел 1 или 0:
источник
somecolumn
. Используяastype(int)
то потерпит неудачу. Другой подход, который преобразуетсяTrue
в 1,0 иFalse
0,0 (с плавающей точкой) при сохранении значений NaN, заключается в следующем:df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
astype(float)
и получить тот же результат?Просто умножьте свой Dataframe на 1 (int)
источник
True
находится1
в Python, а такжеFalse
является0
* :Вы должны быть в состоянии выполнять любые операции , которые вы хотите на них, просто рассматривая их , как если бы они были числами, так как они являются номерами:
Итак, чтобы ответить на ваш вопрос, никакой работы не требуется - у вас уже есть то, что вы ищете.
* Обратите внимание, что я использую это как английское слово, а не ключевое слово Python
is
-True
это не тот же объект, что и любой случайный1
.источник
np.sin(True).dtype
для меня это float16.df.my_column.mean()
нормально звонить (как вы подразумеваете), но когда я пытаюсь:df.groupby("some_other_column").agg({"my_column":"mean"})
я получаюDataError: No numeric types to aggregate
, поэтому кажется, что они НЕ всегда одинаковы. Просто к вашему сведению.bool
столбцы.TypeError: numpy boolean subtract, the
оператор -` устарел, используйте вместо него bitwise_xor,^
оператор или функцию logic_xor. `Использование ответа @ User исправляет это.bool
столбцов, как дляint
столбцовВы также можете сделать это прямо во фреймах
источник
Вы можете использовать преобразование для своего фрейма данных:
преобразование True / False в 1/0
источник
Используйте
Series.view
для преобразования логических значений в целые числа:источник