我在Python的pandas
数据框中有一个列,其中包含布尔值True
/False
,但是为了进行进一步计算,我需要将它们表示为1
/0
。是否有快速的pandas
/numpy
方法来实现这个目标?
我在Python的pandas
数据框中有一个列,其中包含布尔值True
/False
,但是为了进行进一步计算,我需要将它们表示为1
/0
。是否有快速的pandas
/numpy
方法来实现这个目标?
将单个布尔值列简洁地转换为整数值 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})
- DustByte将您的数据框(Dataframe)乘以1(整数)即可。
[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
float
类型,那么这种方法不会破坏它们,而df.astype(int)
则会。由于这是一种hacky的方法,最好在注释中明确表明意图,比如# bool -> int
。 - Dmitriy Workdata * 1
而不是 data + 0
在混合类型时有一个优点 - 它也适用于字符串,而 data + 0
则会抛出错误。在性能方面等效。 - Dmitriy Work这个问题特指单列,因此目前被接受的答案可行。但是,它不能推广到多列。对于那些对通用解决方案感兴趣的人,请使用以下方法:
df.replace({False: 0, True: 1}, inplace=True)
对于包含许多不同类型列的DataFrame,无论其中有多少个是布尔值,此方法均有效。
True
在Python中等同于1
,同样地,False
也等同于0
*:
>>> True == 1
True
>>> False == 0
True
只需将它们视为数字,您就应该能够执行任何操作,因为它们本质上就是数字:
>>> issubclass(bool, int)
True
>>> True * 5
5
回答你的问题,不需要任何工作 - 你已经拥有了你正在寻找的东西。
* 注意我使用is作为英语单词,而不是Python关键字is
- True
将不会是任何随机1
相同的对象。
np.sin(True).dtype
是float16。 - jorgecadf.my_column.mean()
很好地工作(正如你所暗示的那样),但是当我尝试:df.groupby("some_other_column").agg({"my_column":"mean"})
时,我会得到 DataError: No numeric types to aggregate
,因此它们似乎并不总是相同。仅供参考。 - dwandersonTypeError: numpy boolean subtract, the
-operator, is deprecated, use the bitwise_xor, the
^ operator, or the logical_xor function instead.
使用@User的答案可以解决这个问题。 - Amadou Konebool
列,df.col1 + df.col2 + df.col3 的工作方式与 int
列不同。 - colorlace你也可以直接在画框上完成这个操作
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
df["somecolumn"] = df["somecolumn"].astype(bool).astype(int)
经过尝试和测试:
df[col] = df[col].map({'True': 1,'False' :0 })
如果有多个带有True/False的列,请使用以下代码。
for col in bool_cols:
df[col] = df[col].map({'True': 1,'False' :0 })
@AMC 在评论中写下了这句话
我需要把FAKE/REAL映射成0/1,但找不到合适的答案。
请看下面如何将值为FAKE/REAL的列名"type"映射为0/1
(注意:类似的方法可以应用到任何列名和取值中)
df.loc[df['type'] == 'FAKE', 'type'] = 0
df.loc[df['type'] == 'REAL', 'type'] = 1
df['type'] = df['type'].map({'REAL': 1, 'FAKE': 0})
。不过,我不确定这是否与本问题相关。 - AMCdf = pd.DataFrame(my_data condition)
df = df*1