ฉันจะแมป True / False กับ 1/0 ใน Pandas DataFrame ได้อย่างไร


136

ฉันมีคอลัมน์ใน DataFrame ของ python pandas ที่มีค่าบูลีน True / False แต่สำหรับการคำนวณเพิ่มเติมฉันต้องการการแสดง 1/0 มีวิธีทำแบบนี้หรือไม่?


1
ต้องมีการคำนวณอะไรเพิ่มเติม
Jon Clements

ในการ Parrot @JonClements ทำไมคุณต้องแปลง bool เป็น int เพื่อใช้ในการคำนวณ? บูลทำงานร่วมกับเลขคณิตโดยตรง (เนื่องจากเป็น int ภายใน)
cs95

คำตอบ:


279

วิธีที่รวบรัดในการแปลงค่าบูลีนคอลัมน์เดียวเป็นคอลัมน์จำนวนเต็ม 1 หรือ 0:

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

4
กรณีมุมคือถ้ามีค่า NaN อยู่ในsomecolumn. ใช้astype(int)แล้วจะล้มเหลว อีกวิธีหนึ่งซึ่งแปลงTrueเป็น 1.0 และFalse0.0 (ลอยตัว) ในขณะที่รักษาค่า NaN ไว้คือทำ:df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
DustByte

@DustByte จับดี!
Homunculus Reticulli

@DustByte คุณไม่สามารถใช้astype(float)และได้ผลลัพธ์เดียวกันได้หรือไม่?
AMC

66

เพียงแค่คูณ Dataframe ของคุณด้วย 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

ข้อดีของโซลูชันนี้คืออะไร?
AMC

44

Trueอยู่1ใน Python และในทำนองเดียวกันFalseคือ0* :

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

คุณควรจะสามารถที่จะดำเนินการใด ๆ ที่คุณต้องการกับพวกเขาโดยเพียงแค่การรักษาพวกเขาเป็นว่าพวกเขาเป็นตัวเลขที่พวกเขามีตัวเลข:

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

ดังนั้นเพื่อตอบคำถามของคุณไม่จำเป็นต้องทำงานใด ๆ - คุณมีสิ่งที่คุณกำลังมองหาอยู่แล้ว

* หมายเหตุการใช้งานผมคือเป็นคำภาษาอังกฤษไม่ได้เป็นคำหลักงูหลามis- จะไม่เป็นวัตถุเช่นเดียวกับการสุ่มใดTrue1


2
โปรดใช้ความระมัดระวังกับประเภทข้อมูลหากทำการคำนวณทศนิยม: np.sin(True).dtypeเป็น float16 สำหรับฉัน
jorgeca

9
ฉันมีดาต้าเฟรมที่มีคอลัมน์บูลีนและฉันสามารถโทรได้df.my_column.mean()ดี (ตามที่คุณบอก) แต่เมื่อฉันลอง: df.groupby("some_other_column").agg({"my_column":"mean"})ฉันเข้าใจDataError: No numeric types to aggregateแล้วดูเหมือนว่ามันจะไม่เหมือนกันเสมอไป แค่ FYI
dwanderson

ในแพนด้าเวอร์ชัน 24 (และอาจก่อนหน้านี้) คุณสามารถรวมboolคอลัมน์ได้ดี
BallpointBen

1
ดูเหมือนว่า numpy จะแสดงข้อผิดพลาดด้วยTypeError: numpy boolean subtract, the ตัวดำเนินการประเภทบูลีนด้วยเช่นกัน: -` เลิกใช้แล้วให้ใช้ bitwise_xor ตัว^ดำเนินการหรือฟังก์ชัน logical_xor แทนการใช้คำตอบของผู้ใช้ @ จะแก้ไขปัญหานี้
Amadou Kone

อีกเหตุผลหนึ่งที่ไม่เหมือนกัน: df.col1 + df.col2 + df.col3 ไม่ทำงานกับboolคอลัมน์เหมือนกับintคอลัมน์
colorlace

22

คุณสามารถทำได้โดยตรงบนเฟรม

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

คุณสามารถใช้การแปลงสำหรับกรอบข้อมูลของคุณ:

df = pd.DataFrame(my_data condition)

การแปลง True / False ใน 1/0

df = df*1

นี่เหมือนกับโซลูชันนี้ซึ่งโพสต์ไว้เมื่อ 3 ปีก่อนหน้านี้
AMC

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.