在具有混合数据类型的数据框中将所有出现的真/假转换为 1/0 [重复]

Posted

技术标签:

【中文标题】在具有混合数据类型的数据框中将所有出现的真/假转换为 1/0 [重复]【英文标题】:Converting all occurrence of True/False to 1/0 in a dataframe with mixed datatype [duplicate] 【发布时间】:2016-11-24 18:45:18 【问题描述】:

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

我在这里看到了一些解决方案,例如将列转换为整数。但我想避免遍历 100 列的练习。

这是我尝试失败的方法:

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

但是数据框测试还是有真/假

【问题讨论】:

x 可能等于True,而不是'True'。即便如此,您仍然需要先转换列类型;将1 存储在布尔字段中仍将仅存储True 【参考方案1】:

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)

【讨论】:

可能是因为,当我应用 fillna 时,它会将数据类型从 boolean 转换为 int64。因为所有这些列当前都有数据类型 int64。 有趣的是 df.replace(False, 0) 对我不起作用。我正在运行 python 2.7 - 虽然我怀疑它在 3.0 中有所不同 @kiltannen 更可能与 pandas 版本有关。 很高兴知道 - 谢谢。 lambda 替换对我来说效果很好 - 但 df.replace 看起来更加优雅,我想使用它。【参考方案2】:
int(True) 

int(1==1)

或与 lambda 一起使用:

λx: int(x)

真为 1,假为 0,-1 为 -1。

【讨论】:

【参考方案3】:

定义一个函数,通过 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)

【讨论】:

【参考方案4】:

对于单个列,目前最简单的方法是转换列类型。 Pandas 足够聪明,可以正确地将 boolean 映射到 int。

df.column_name = df.column_name.astype(int)

如果df.column_name以Boolean开头,转换为int类型后会变成0和1

【讨论】:

【参考方案5】:

您可以使用乘以 1 轻松做到这一点。如果这样做,您的所有数据框都将被转换:

df*1

【讨论】:

以上是关于在具有混合数据类型的数据框中将所有出现的真/假转换为 1/0 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法在python数据框中将列类型从对象转换为str

将具有随机生成的假数据的动态数据帧转换为静态数据帧

在python中将具有不同数据类型的pandas数据框导出到csv

pyspark 在循环中将数组转换为字符串

处理具有混合日期格式的 Pandas 数据框列

将多个火花数据框列转换为具有列表类型的单列