在具有混合数据类型的数据框中将所有出现的真/假转换为 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章