【问题标题】:pandas: converting all columns with 2 values to True/Falsepandas:将所有具有 2 个值的列转换为 True/False
【发布时间】:2019-01-14 09:27:22
【问题描述】:

我有一个熊猫数据框。有些列只有 2 个唯一值(例如 GOOD/BAD、HIGH/LOW、FAIL/PASS)。它们的 dtype 是 object,因为数据帧是从 CSV 文件加载的。

我想将这些列转换为真/假,并自动将列名更改为is_FIRST_VALUE

例如,

  X1   X2   X3  
  HIGH FAIL GOOD
  HIGH PASS GOOD
  LOW  FAIL BAD

应该转换:

X1_is_HIGH  X2_is_FAIL  X3_is_GOOD
True        True        True
True        False       True
False       True        False

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以试试这个。遍历每一列。获取列的第一个唯一值。条件是该行是否包含此唯一值。由于我们想要条件的结果,只需将该值设置为列。

    df = pd.DataFrame({
                    'X1' : ['HIGH', 'LOW', 'HIGH', 'HIGH'], 
                    'X2' : ['FAIL', 'PASS','FAIL', 'PASS'],
                    'X3' : ['GOOD','GOOD', 'BAD', 'BAD']
                })
    
    for column in df.columns:
        uni = df[column].unique()[0]
        mask = df[column] == uni
        df[column] = mask
        df.rename(columns = {column:column+'_'+uni}, inplace=True)
    
        X1_HIGH         X2_FAIL         X3_GOOD
    0   True            True            True
    1   False           False           True
    2   True            True            False
    3   True            False           False
    

    【讨论】:

      【解决方案2】:

      您可以使用字典来指定您的True 条件。然后迭代您的列以更新它们。最后,使用pd.DataFrame.rename 通过自定义函数重命名列。

      d = {'X1': 'HIGH', 'X2': 'FAIL', 'X3': 'GOOD'}
      
      for col in df:
          df[col] = df[col] == d[col]
      
      df = df.rename(columns=lambda x: x+'_'+d[x])
      
      print(df)
      
        X1_HIGH X2_FAIL X3_GOOD
      0    True    True    True
      1    True   False    True
      2   False    True   False
      

      【讨论】:

      • 可以自动执行吗?数据框非常大,我手头没有字典。
      • Pandas 是如何知道你想要 X1 的 'HIGH' == True 的?它可以做很多事情,但它不能读心:)
      【解决方案3】:

      您也可以使用pandas.get_dummies() 来转换分类:

      import pandas as pd
      df = pd.DataFrame({'X1': ['HIGH','HIGH','LOW'], 'X2': ['FAIL','PASS','FAIL'], 'X3': ['GOOD','GOOD','BAD']})
      df2 = pd.get_dummies(df, drop_first=True)
      print(df2.astype(bool))
      
      # returns:
      #   X1_LOW  X2_PASS  X3_GOOD
      # 0   False    False     True
      # 1   False     True     True
      # 2    True    False    False
      

      编辑:以获得您要求的输出:

      df2 = pd.get_dummies(df)
      print(df2.loc[:,df2.iloc[0] == 1].astype(bool))
      
      # returns
      #   X1_HIGH  X2_FAIL  X3_GOOD
      # 0     True     True     True
      # 1     True    False     True
      # 2    False     True    False
      

      【讨论】:

        猜你喜欢
        • 2021-10-13
        • 1970-01-01
        • 2020-09-25
        • 1970-01-01
        • 1970-01-01
        • 2020-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多