Làm cách nào tôi có thể ánh xạ Đúng / Sai thành 1/0 trong Khung dữ liệu Pandas?


133

Tôi có một cột trong python pandas DataFrame có các giá trị True / false boolean, nhưng để tính toán thêm, tôi cần đại diện 1/0. Có một cách nhanh chóng gấu trúc / numpy để làm điều đó?


1
Những tính toán nào nữa được yêu cầu?
Jon Clements

Để parrot @JonClements, tại sao bạn cần chuyển đổi bool sang int để sử dụng trong tính toán? bool làm việc với số học trực tiếp (vì nó là int int).
cs95

Câu trả lời:


276

Một cách ngắn gọn để chuyển đổi một cột giá trị boolean thành cột số nguyên 1 hoặc 0:

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

4
Trường hợp góc là nếu có giá trị NaN trong somecolumn. Sử dụng astype(int)sau đó sẽ thất bại. Một cách tiếp cận khác, chuyển đổi Truethành 1.0 và False0,0 (phao) trong khi bảo tồn các giá trị NaN là làm:df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
DustByte

@DustByte Bắt tốt!
Homunculus Reticulli

@DustByte Bạn không thể sử dụng astype(float)và nhận được kết quả tương tự?
AMC

65

Chỉ cần nhân Dataframe của bạn với 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

Những lợi thế của giải pháp này là gì?
AMC

44

True1trong Python và tương tự False0* :

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

Bạn sẽ có thể thực hiện bất kỳ thao tác nào bạn muốn trên chúng bằng cách chỉ coi chúng như thể chúng là số, vì chúng số:

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

Vì vậy, để trả lời câu hỏi của bạn, không có công việc cần thiết - bạn đã có những gì bạn đang tìm kiếm.

* Lưu ý tôi sử dụng một từ tiếng Anh, không phải từ khóa Python is- Truesẽ không phải là cùng một đối tượng như bất kỳ ngẫu nhiên nào 1.


1
Chỉ cần cẩn thận với các loại dữ liệu nếu làm toán học dấu phẩy động: np.sin(True).dtypelà float16 đối với tôi.
jorgeca

9
Tôi đã có một khung dữ liệu với một cột boolean và tôi có thể gọi df.my_column.mean()là tốt (như bạn ngụ ý), nhưng khi tôi thử: df.groupby("some_other_column").agg({"my_column":"mean"})Tôi nhận được DataError: No numeric types to aggregate, vì vậy nó xuất hiện KHÔNG phải lúc nào cũng giống nhau. Chỉ cần FYI.
dwanderson

Trong phiên bản gấu trúc 24 (và có thể sớm hơn), bạn có thể tổng hợp boolcác cột tốt.
BallpointBen

1
Có vẻ như numpy cũng đưa ra các lỗi với các kiểu boolean: TypeError: numpy boolean subtract, the toán tử -`, không được dùng nữa, sử dụng hàm bitwise_xor, ^toán tử hoặc hàm logic_xor để thay thế.
Amadou Kone

Một lý do khác không giống nhau: df.col1 + df.col2 + df.col3 không hoạt động đối với boolcác cột như đối với intcác cột
colorlace

22

Bạn cũng có thể làm điều này trực tiếp trên Khung

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

Bạn có thể sử dụng một chuyển đổi cho khung dữ liệu của bạn:

df = pd.DataFrame(my_data condition)

biến đổi đúng / sai trong 1/0

df = df*1

Đây là giống hệt với giải pháp này , được đăng 3 năm trước.
AMC

1

Sử dụng Series.viewđể chuyển đổi boolean sang số nguyên:

df["somecolumn"] = df["somecolumn"].view('i1')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.