我如何将True/False映射到1/0在一个熊猫数据框架?

我在python pandas DataFrame中有一个列,它具有布尔值True/False,但为了进一步计算,我需要1/0表示。是否有一个快速的pandas/numpy方法来做到这一点?

317092 次浏览

True在Python中是1,同样地,False0:

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

你应该能够对它们执行任何你想要的操作,只要把它们当作数字来对待,就像它们数字一样:

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

所以回答你的问题,不需要工作,你已经有了你要找的东西。

*注意,我使用is作为一个英语单词,而不是Python关键字is - True将不是任何随机1的相同对象。

你也可以直接在框架上这样做

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

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

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

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

你可以为你的数据帧使用一个转换:

df = pd.DataFrame(my_data condition)

将True/False转换为1/0

df = df*1

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

df["somecolumn"] = df["somecolumn"].view('i1')

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

请在下面找到如何将列名'type'的值为FAKE/REAL映射为0/1
(注意:类似可以应用于任何列名和值)

df.loc[df['type'] == 'FAKE', 'type'] = 0
df.loc[df['type'] == 'REAL', 'type'] = 1

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

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

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

这是一个基于现有答案的可重复的例子:

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})