223

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

4

9 回答 9

426

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

df["somecolumn"] = df["somecolumn"].astype(int)
于 2014-12-08T16:36:19.740 回答
86

只需将您的数据框乘以 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
于 2016-06-05T21:54:35.933 回答
48

True1Python 中,同样False0*

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

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

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

因此,要回答您的问题,无需工作 - 您已经拥有了您正在寻找的东西。

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

于 2013-06-29T17:58:36.213 回答
24

您也可以直接在 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
于 2013-06-29T18:17:18.243 回答
24

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

df.replace({False: 0, True: 1}, inplace=True)

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

于 2020-12-21T15:30:20.543 回答
3

您可以对数据框使用转换:

df = pd.DataFrame(my_data condition)

将 True/False 转换为 1/0

df = df*1
于 2019-12-24T20:27:18.510 回答
3

用于Series.view将布尔值转换为整数:

df["somecolumn"] = df["somecolumn"].view('i1')
于 2020-04-13T12:41:54.867 回答
1

我不得不将 FAKE/REAL 映射到 0/1,但找不到正确的答案。

请在下面找到如何将具有 FAKE/REAL 值的列名称“类型”映射到 0/1
(注意:类似的可以应用于任何列名称和值)

df.loc[df['type'] == 'FAKE', 'type'] = 0
df.loc[df['type'] == 'REAL', 'type'] = 1
于 2020-09-29T21:39:25.047 回答
1

这是基于一些现有答案的可重现示例:

import pandas as pd


def bool_to_int(s: pd.Series) -> pd.Series:
    """Convert the boolean to binary representation, maintain NaN values."""
    return s.replace({True: 1, False: 0})


# generate a random dataframe
df = pd.DataFrame({"a": range(10), "b": range(10, 0, -1)}).assign(
    a_bool=lambda df: df["a"] > 5,
    b_bool=lambda df: df["b"] % 2 == 0,
)

# select all bool columns (or specify which cols to use)
bool_cols = [c for c, d in df.dtypes.items() if d == "bool"]

# apply the new coding to a new dataframe (or can replace the existing one)
df_new = df.assign(**{c: lambda df: df[c].pipe(bool_to_int) for c in bool_cols})
于 2022-01-17T14:35:08.340 回答