Bagaimana saya bisa memetakan Benar / Salah ke 1/0 di Pandas DataFrame?

134

Saya memiliki kolom dalam python panda DataFrame yang memiliki nilai boolean Benar / Salah, tetapi untuk perhitungan lebih lanjut saya memerlukan representasi 1/0. Apakah ada cara cepat panda / numpy untuk melakukan itu?

Simon Righley
sumber
1
Apa perhitungan lebih lanjut yang diperlukan?
Jon Clements
Untuk parrot @ Joncon, mengapa Anda perlu mengkonversi bool ke int untuk digunakan dalam perhitungan? bool bekerja dengan aritmatika secara langsung (karena secara internal merupakan int).
cs95

Jawaban:

277

Cara ringkas untuk mengonversi satu kolom nilai boolean ke kolom bilangan bulat 1 atau 0:

df["somecolumn"] = df["somecolumn"].astype(int)
Pengguna
sumber
4
Kasus sudut adalah jika ada nilai NaN di somecolumn. Menggunakan astype(int)kemudian akan gagal. Pendekatan lain, yang mengkonversi Trueke 1.0 dan Falseke 0.0 (mengapung) sambil mempertahankan nilai NaN adalah dengan melakukan:df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
DustByte
@DustByte Tangkapan bagus!
Homunculus Reticulli
@ DustByte Tidak bisakah Anda menggunakan astype(float)dan mendapatkan hasil yang sama?
AMC
65

Cukup gandakan Bingkai Data Anda dengan 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
sumber
Apa kelebihan dari solusi ini?
AMC
44

Trueadalah 1Python, dan juga Falseadalah 0* :

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

Anda harus dapat melakukan operasi apa pun yang Anda inginkan dengan hanya memperlakukannya seolah-olah itu angka, karena itu angka:

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

Jadi untuk menjawab pertanyaan Anda, tidak perlu bekerja - Anda sudah memiliki apa yang Anda cari.

* Catatan yang saya gunakan adalah sebagai kata bahasa Inggris, bukan kata kunci Python is- Truetidak akan menjadi objek yang sama dengan sembarang acak 1.

Gareth Latty
sumber
1
Berhati-hatilah dengan tipe data jika melakukan matematika titik mengambang: np.sin(True).dtypeadalah float16 untuk saya.
jorgeca
9
Saya punya kerangka data dengan kolom boolean, dan saya bisa memanggilnya dengan df.my_column.mean()baik (seperti yang Anda maksudkan), tetapi ketika saya mencoba: df.groupby("some_other_column").agg({"my_column":"mean"})saya mengerti DataError: No numeric types to aggregate, jadi sepertinya TIDAK selalu sama. Hanya FYI.
dwanderson
Dalam panda versi 24 (dan mungkin sebelumnya), Anda dapat mengumpulkan boolkolom dengan baik.
BallpointBen
1
Sepertinya numpy juga melempar kesalahan dengan tipe boolean: TypeError: numpy boolean subtract, the -` operator, sudah tidak digunakan lagi, gunakan bitwise_xor, ^operator, atau fungsi logical_xor sebagai gantinya.` Menggunakan @ Jawaban pengguna memperbaikinya.
Amadou Kone
Alasan lain tidak sama: df.col1 + df.col2 + df.col3 tidak berfungsi untuk boolkolom seperti halnya pada intkolom
colorlace
22

Anda juga dapat melakukan ini langsung di 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
Jeff
sumber
2

Anda dapat menggunakan transformasi untuk bingkai data Anda:

df = pd.DataFrame(my_data condition)

mentransformasikan Benar / Salah dalam 1/0

df = df*1
Bruno Benevides
sumber
Ini identik dengan solusi ini , diposting 3 tahun sebelumnya.
AMC
1

Gunakan Series.viewuntuk mengkonversi boolean ke integer:

df["somecolumn"] = df["somecolumn"].view('i1')
jezrael
sumber