如何在Pandas DataFrame中将True / False映射到1/0?


133

我在python pandas DataFrame中有一列具有布尔True / False值的列,但是对于进一步的计算,我需要1/0表示形式。有没有一种快速的方法来做到这一点?


1
需要进行哪些进一步的计算?
乔恩·克莱门茨

要模仿@JonClements,为什么需要将bool转换为int以用于计算?bool直接与算术一起工作(因为它在内部是int)。
cs95

Answers:


276

一种将布尔值的单列转换为整数1或0的列的简洁方法:

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

4
极端的情况是中是否存在NaN值somecolumn。使用astype(int)将失败。另一种方法是在保留NaN值的同时转换True为1.0和False0.0(浮点数):df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
DustByte

@DustByte好抓住!
Homunculus Reticulli

@DustByte您不能只使用astype(float)并获得相同的结果吗?
AMC

65

只需将您的数据框乘以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

True1在Python,同样False0*

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

通过将它们视为数字,就可以对它们执行所需的任何操作,因为它们数字:

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

因此,回答您的问题,无需任何工作-您已经有了所需的东西。

*请注意,我使用的英文单词,而不是Python关键字is- True与任何random都不是同一对象1


1
如果要进行浮点数学运算,请小心数据类型:np.sin(True).dtype对我来说是float16。
jorgeca 2013年

9
我有一个带有布尔列的数据框,可以df.my_column.mean()很好地调用(如您所暗示的),但是当我尝试时:df.groupby("some_other_column").agg({"my_column":"mean"})I get DataError: No numeric types to aggregate,所以看起来它们并不总是相同。仅供参考。
dwanderson '16

在pandas版本24中(可能更早),您可以聚合bool列。
BallpointBen

1
看起来numpy还会引发布尔类型的错误:TypeError: numpy boolean subtract, the -`运算符,已弃用,改用bitwise_xor,^运算符或logical_xor函数。使用@User 的答案可解决此问题。
Amadou通力

另一个原因是不一样的: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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.