代码之家  ›  专栏  ›  技术社区  ›  Swastik Bhattacharyya

如何在同一类别类型的多列上运行get_dummies()函数?

  •  2
  • Swastik Bhattacharyya  · 技术社区  · 1 年前

    我有DataFrame的功能,(比方说)看起来像这样:

    症状A 症状B
    瘙痒 皮疹
    皮疹 瘙痒

    当我在这个数据帧上运行get_dummies函数时,它将创建四列,名为 'Symptom_A_Itching', 'Symptom_A_Rash', 'Symptom_B_Rash', 'Symptom_B_Itching' 。我不想单独处理这两个值,因为它是用这个函数完成的。

    有没有任何方法可以对这个数据帧执行一个热编码,其中这两列的值不会被单独处理。

    基本上,我想得到一个带有列的DataFrame 'Symptom_Itching', 'Symptom_Rash'

    我尝试在get_dummies函数中使用列和前缀参数,但没有产生任何结果。我还尝试将所有症状列名称设置为 'Symptom' 而不是 'Symptom_A', 'Symptom_B' ,但这也不起作用。

    这是我的代码:

    data_frame: DataFrame = read_csv('dataset.csv')
    features: DataFrame = data_frame.iloc[:, 1:]
    features.fillna('')
    x: DataFrame = get_dummies(features)
    
    2 回复  |  直到 1 年前
        1
  •  2
  •   mozway    1 年前

    stack 然后 get_dummies groupby.max() :

    out = (df
       .stack().str.get_dummies()
       .groupby(level=0).max()
     )
    

    或者使用技巧获取具有相同名称和 groupby.max() 在…上 axis=1 :

    out = (pd.get_dummies(df.rename(columns=lambda x: ''), prefix_sep='')
             .groupby(level=0, axis=1).max()
           )
    

    输出:

       Itching  Rash
    0        1     1
    1        1     1
    
        2
  •  0
  •   R__i_    1 年前

    您可以使用 pandas.DataFrame.drop 删除列。根据文件:

    pandas.DataFrame.drop

    从行或列中删除指定的标签。

    通过指定标签名称和相应的删除行或列 轴,或者通过直接指定索引或列名。当使用 多索引,可以通过指定 水平。

    对于给定的示例,您可以尝试(您需要 适应 这种csv解析方法):

    import pandas as pd
    
    df = pd.DataFrame(
        {   
            'SymptomA': ['Itching', 'Rash'],
            'SymptomB': ['Rash', 'Itching']
        })
    df_onehot = pd.get_dummies(df['SymptomA'])
    df = df.drop('SymptomA', axis=1)
    df = df.drop('SymptomB', axis=1)
    df = df.join(df_onehot)
    print(df)
    
    # Output:
    
    #    Itching   Rash
    # 0     True  False
    # 1    False   True