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?


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)

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

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.


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

2

Anda dapat menggunakan transformasi untuk bingkai data Anda:

df = pd.DataFrame(my_data condition)

mentransformasikan Benar / Salah dalam 1/0

df = df*1

Ini identik dengan solusi ini , diposting 3 tahun sebelumnya.
AMC

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.