Pandas DataFrame'de Doğru / Yanlış'ı 1/0 ile nasıl eşleyebilirim?


136

Python pandas DataFrame'de boolean True / False değerlerine sahip bir sütunum var, ancak daha fazla hesaplama için 1/0 gösterime ihtiyacım var. Bunu yapmanın hızlı bir pandalar / uyuşuk yolu var mı?


1
Başka hangi hesaplamalar gerekli?
Jon Clements

@JonClements'ın papağanını yazmak için, neden hesaplamada kullanmak için bool'u int'e dönüştürmeniz gerekiyor? bool, doğrudan aritmetik ile çalışır (dahili olarak bir int olduğu için).
cs95

Yanıtlar:


279

Tek bir boole değerleri sütununu 1 veya 0 tam sayılarından oluşan bir sütuna dönüştürmenin kısa ve öz bir yolu:

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

4
Köşe durumu, içinde NaN değerleri olup olmadığıdır somecolumn. Kullanmak astype(int)daha sonra başarısız olacaktır. NaN değerlerini korurken True1.0 ve False0.0'a (yüzer) dönüşen başka bir yaklaşım da şu şekilde olacaktır:df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
DustByte

@DustByte İyi yakala!
Homunculus Reticulli

@DustByte Sadece kullanıp astype(float)aynı sonucu alamaz mısınız?
AMC

66

Dataframe'inizi 1 (int) ile çarpmanız yeterli

[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

Bu çözümün avantajları nelerdir?
AMC

44

Trueolduğu 1Python ve benzer şekilde Falseolduğunu 0* :

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

Onların onlar, sayılar sanki sadece onları davranarak onlara istediğiniz işlemleri gerçekleştirmek mümkün olmalıdır şunlardır numaraları:

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

Yani sorunuzu yanıtlamak için hiçbir işe gerek yok - aradığınız şeye zaten sahipsiniz.

* Not I kullanımı olan İngilizce bir kelimenin, değil Python anahtar kelime olarak is- Trueherhangi rasgele aynı nesne olmayacaktır 1.


2
Kayan nokta matematiği yapıyorsanız veri türlerine dikkat edin: np.sin(True).dtypebenim için float16'dır.
jorgeca

9
Boole sütunu olan bir veri çerçevem ​​var ve df.my_column.mean()gayet iyi diyebilirim (sizin ima ettiğiniz gibi), ama denediğimde: df.groupby("some_other_column").agg({"my_column":"mean"})Anlıyorum DataError: No numeric types to aggregate, bu yüzden her zaman aynı DEĞİLDİR . Sadece bilginize.
dwanderson

Pandalar sürüm 24'te (ve belki daha önceki sürümlerde) boolsütunları gayet iyi bir şekilde toplayabilirsiniz .
BallpointBen

1
Görünüşe göre numpy aynı zamanda boole türlerinde de hatalar atıyor: TypeError: numpy boolean subtract, the -` operatörü, kullanımdan kaldırıldı, bunun yerine bitwise_xor, ^operatörü veya logical_xor fonksiyonunu kullanın.` @ Kullanıcının cevabını kullanmak bunu düzeltir.
Amadou Kone

Aynı şey olmadığını başka neden: df.col1 + df.col2 + df.col3 için değil çalışır boolonun için yaptığı gibi sütunlar intsütunlar
colorlace

22

Bunu doğrudan Frames üzerinden de yapabilirsiniz.

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

Veri çerçeveniz için bir dönüşüm kullanabilirsiniz:

df = pd.DataFrame(my_data condition)

Doğru / Yanlışı 1/0 olarak dönüştürme

df = df*1

Bu, 3 yıl önce yayınlanan bu çözümle aynıdır .
AMC

1

Series.viewBoole'yi tamsayılara dönüştürmek için kullanın :

df["somecolumn"] = df["somecolumn"].view('i1')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.