【问题标题】:Converting all occurrence of True/False to 1/0 in a dataframe with mixed datatype [duplicate]在具有混合数据类型的数据框中将所有出现的真/假转换为 1/0 [重复]
【发布时间】: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

标签: python data-manipulation


【解决方案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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-09
          • 2016-02-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-23
          • 1970-01-01
          • 2013-04-08
          相关资源
          最近更新 更多