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

Sim*_*ley 97 python numpy pandas

我在python pandas DataFrame中有一个列具有布尔值True/False值,但是为了进一步计算,我需要1/0表示.有快速的熊猫/ numpy方式吗?

编辑:下面的答案似乎没有在numpy的情况下,给定一个具有整数和True/False值的dtype=object数组,返回此类数组.为了在numpy中进行进一步的计算,我必须明确地设置np_values = np.array(df.values, dtype = np.float64).

Use*_*ser 204

只是非常明确地回答如何将单列布尔值转换为整数1或0的列的问题:

df.somecolumn = df.somecolumn.astype(int)

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

shu*_*l27 59

只需将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
Run Code Online (Sandbox Code Playgroud)

  • @AMC 没有,这是一种很奇怪的方法。 (5认同)
  • @AMC 如果您的数据框除了布尔值之外还有“float”类型,则此方法不会破坏它们,“df.astype(int)”会破坏它们。由于它很 hacky,因此使用像“# bool -> int”这样的注释来明确意图可能是个好主意。 (2认同)
  • 在混合类型中使用“data * 1”相对于“data + 0”有一个优点——它也适用于字符串,而“data + 0”会抛出错误。同等性能方面。 (2认同)

Gar*_*tty 43

True1在Python,同样False0*:

>>> True == 1
True
>>> False == 0
True
Run Code Online (Sandbox Code Playgroud)

您应该能够通过将它们视为数字来执行您想要的任何操作,因为它们数字:

>>> issubclass(bool, int)
True
>>> True * 5
5
Run Code Online (Sandbox Code Playgroud)

所以要回答你的问题,没有必要的工作 - 你已经拥有了你想要的东西.

*注意我使用的英文单词,而不是Python关键字is- True不会是任何随机的同一个对象1.

  • 我有一个带有布尔列的数据框,我可以调用`df.my_column.mean()`就好了(你暗示),但是当我尝试:`df.groupby("some_other_column").agg({ "my_column":"mean"})`我得到`DataError:没有数字类型来聚合`,所以看起来它们不是**总是一样的.仅供参考. (8认同)
  • 如果进行浮点数学运算,请注意数据类型:`np.sin(True).dtype` 对我来说是 float16。 (2认同)

Jef*_*eff 21

您也可以直接在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
Run Code Online (Sandbox Code Playgroud)


小智 11

这个问题特别提到了一个列,所以目前接受的答案是有效的。但是,它不能推广到多列。对于那些对通用解决方案感兴趣的人,请使用以下内容:

df.replace({False: 0, True: 1}, inplace=True)
Run Code Online (Sandbox Code Playgroud)

这适用于包含许多不同类型的列的 DataFrame,无论有多少是布尔值。