Як я можу зіставити True / False на 1/0 у програмі DataFrame Pandas?


133

У мене стовпчик у пандах Python DataFrame, який має булі значення True / False, але для подальших розрахунків мені потрібно представлення 1/0. Чи є швидкий панди / нумізний спосіб це зробити?


1
Які подальші розрахунки потрібні?
Джон Клементс

Щоб папуга @JonClements, для чого вам потрібно перетворити bool в int, щоб використовувати його для обчислення? bool працює з арифметикою безпосередньо (оскільки це внутрішньо int).
cs95

Відповіді:


276

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

df["somecolumn"] = df["somecolumn"].astype(int)

4
Кутовий випадок - якщо в ньому є значення NaN 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

65

Просто помножте свій 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

Які переваги цього рішення?
AMC

44

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

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

Ви повинні мати змогу виконувати будь-які потрібні вам операції, просто обробляючи їх як би числами, оскільки вони є числами:

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

Отже, щоб відповісти на ваше запитання, робота не потрібна - у вас вже є те, що ви шукаєте.

* Використання Note I це як англійське слово, а не ключовим слово Python is- Trueне буде такою ж об'єкт , як і будь-який випадковий 1.


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, тому, здається, вони НЕ завжди однакові. Просто FYI.
dwanderson

У версіях 24 панд (а може і раніше) ви можете boolпросто збирати стовпці.
BallpointBen

1
Схоже, numpy також видаляє помилки з булевими типами: TypeError: numpy boolean subtract, the -`оператор, застарілий, замість цього використовуйте функцію bitwise_xor, ^оператор або логічний_xor.` Використання @ відповіді користувача виправляє це.
Amadou Kone

Ще одна причина - це не те саме: df.col1 + df.col2 + df.col3 не працює для boolстовпців, як для intстовпців
colorlace

22

Ви також можете це зробити безпосередньо на Frames

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)

перетворення Істинного / Неправдивого в 1/0

df = df*1

Це ідентично це рішення , розміщене на 3 роки раніше.
AMC

1

Використовувати Series.viewдля перетворення булевих в цілі числа:

df["somecolumn"] = df["somecolumn"].view('i1')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.