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?
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?
Jawaban:
Cara ringkas untuk mengonversi satu kolom nilai boolean ke kolom bilangan bulat 1 atau 0:
df["somecolumn"] = df["somecolumn"].astype(int)
somecolumn
. Menggunakan astype(int)
kemudian akan gagal. Pendekatan lain, yang mengkonversi True
ke 1.0 dan False
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)
[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
True
adalah 1
Python, dan juga False
adalah 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
- True
tidak akan menjadi objek yang sama dengan sembarang acak 1
.
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 mengerti DataError: 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 pada int
kolom
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
Anda dapat menggunakan transformasi untuk bingkai data Anda:
df = pd.DataFrame(my_data condition)
df = df*1
Gunakan Series.view
untuk mengkonversi boolean ke integer:
df["somecolumn"] = df["somecolumn"].view('i1')