在一个混合数据类型的数据框中,将所有True/False值转换为1/0。

8

我有一个数据框,其中大约有100列,其中包括一些布尔列和一些字符列。我想将所有具有True / False和-1值的布尔值替换为1/0,并且我想将其应用于整个数据框,而不是单个列。

我在这里看到了一些解决方案,比如将列转换为整数。但我想避免浏览数百列的练习。

以下是我尝试但未成功的内容:

test.applymap(lambda x: 1 if x=='True' else x)
test.applymap(lambda x: 0 if x=='False' else x)

但是数据框测试仍然具有True/False。

x 可能等于 True,而不是 'True'。即便如此,你仍然需要先转换列类型;将 1 存储在布尔字段中仍然只会存储 True - Martijn Pieters
5个回答

13

applymap 默认情况下不是原地操作,它会返回一个新的数据帧。

正确的方式:

test = test.applymap(lambda x: 1 if x == True else x)
test = test.applymap(lambda x: 0 if x == False else x)
或者
test = test.applymap(lambda x: 1 if x == True else x).test.applymap(lambda x: 0 if x=='False' else x)

或者简单地说

test.applymap(lambda x: 1 if x == True else x, inplace=True)
test.applymap(lambda x: 0 if x == False else x, inplace=True)


尽管 replace 看起来是实现这个目标的最好方法:

test.replace(False, 0, inplace=True)

1
可能是因为当我使用fillna函数时,它将数据类型从布尔型转换为int64型。因为所有这些列当前的数据类型都是int64型。 - muni
有趣的是,df.replace(False, 0) 对我没有起作用。我正在运行Python 2.7 - 尽管我怀疑在3.0中是否有所不同。 - kiltannen
@kiltannen 更可能与pandas版本有关。 - DeepSpace
很好知道 - 谢谢。Lambda替换对我来说确实很有效 - 但是df.replace看起来更加优雅,所以我想使用它。 - kiltannen

5
对于单列而言,最简单的方法就是转换列类型。Pandas聪明地将布尔型正确映射为整型。
df.column_name = df.column_name.astype(int)

如果df.column_name以Boolean格式开始,将转换为int类型后变成0和1。

1
定义一个函数,循环遍历DataFrame的每一列,并使用.replace()方法进行替换:
def replace_boolean(data):
    for col in data:
        data[col].replace(True, 1, inplace=True)
        data[col].replace(False, 0, inplace=True)

replace_boolean(test)

0

你可以轻松地使用乘以1的方法来实现。这样做,你的所有数据框都会被转换:

df*1

-1
int(True) 

或者

int(1==1)

或者用于lambda:

lambda x: int(x)

True将变为1,False将变为0,-1仍然是-1。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接