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?
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:
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
0120TrueFalseTrue1FalseFalseTrue[3]:print data*101201011001
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*55
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.
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
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
Jawaban:
Cara ringkas untuk mengonversi satu kolom nilai boolean ke kolom bilangan bulat 1 atau 0:
sumber
somecolumn
. Menggunakanastype(int)
kemudian akan gagal. Pendekatan lain, yang mengkonversiTrue
ke 1.0 danFalse
ke 0.0 (mengapung) sambil mempertahankan nilai NaN adalah dengan melakukan:df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
astype(float)
dan mendapatkan hasil yang sama?Cukup gandakan Bingkai Data Anda dengan 1 (int)
sumber
True
adalah1
Python, dan jugaFalse
adalah0
* :Anda harus dapat melakukan operasi apa pun yang Anda inginkan dengan hanya memperlakukannya seolah-olah itu angka, karena itu angka:
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
-True
tidak akan menjadi objek yang sama dengan sembarang acak1
.sumber
np.sin(True).dtype
adalah float16 untuk saya.df.my_column.mean()
baik (seperti yang Anda maksudkan), tetapi ketika saya mencoba:df.groupby("some_other_column").agg({"my_column":"mean"})
saya mengertiDataError: No numeric types to aggregate
, jadi sepertinya TIDAK selalu sama. Hanya FYI.bool
kolom dengan baik.TypeError: numpy boolean subtract, the
-` operator, sudah tidak digunakan lagi, gunakan bitwise_xor,^
operator, atau fungsi logical_xor sebagai gantinya.` Menggunakan @ Jawaban pengguna memperbaikinya.bool
kolom seperti halnya padaint
kolomAnda juga dapat melakukan ini langsung di Frames
sumber
Anda dapat menggunakan transformasi untuk bingkai data Anda:
mentransformasikan Benar / Salah dalam 1/0
sumber
Gunakan
Series.view
untuk mengkonversi boolean ke integer:sumber