【问题标题】:onehot encoding and pandas using scikit learn使用 scikit 学习的一种热编码和熊猫
【发布时间】:2021-12-22 10:28:48
【问题描述】:

我正在从 Pandas 数据帧构建一个热编码函数,但无法弄清楚如何将数据取回数据帧。我明白了:

"IndexError: 只有整数、切片 (:)、省略号 (...)、 numpy.newaxis (None) 和整数或布尔数组是有效的 指数

如何将其重新整合回 pandas 数据框?

def one_hot_encoder (features, df_to_encode):
    """encoder to encoder  

    Parameters:
    features (list): features to normalise
    df_to_encode (pandas dataframe): dataframe to encode

    Returns:
    dataframe: dataframe to encode 
    """
   from sklearn.preprocessing import OneHotEncoder    
   for column in features: 
        # one hot encoder 
        enc = OneHotEncoder(sparse=False)
        column_norm = column + "_encoded"
        df = enc.fit_transform(df_to_encode[[column]])

    return df

columns_to_one_hot_encode = ["type"]
df = one_hot_encoder(columns_to_one_hot_encode,df)

我使用的数据来自https://www.kaggle.com/ealaxi/paysim1

【问题讨论】:

    标签: pandas dataframe scikit-learn


    【解决方案1】:

    您可以使用内置 SciKit 的 OneHotEncoderget_feature_names,然后删除旧列。这样你还是可以用OneHotEncoder代替pd.get_dummies

    import pandas as pd
    
    def one_hot_encoder (features, df_to_encode):
        """encoder to encoder  
    
        Parameters:
        features (list): features to normalise
        df_to_encode (pandas dataframe): dataframe to encode
    
        Returns:
        dataframe: dataframe to encode 
        """  
        from sklearn.preprocessing import OneHotEncoder
        for column in features: 
           enc = OneHotEncoder(sparse=False)
           df_enc = pd.DataFrame(enc.fit_transform(df_to_encode[[column]]))
           df_enc.columns = enc.get_feature_names([column])
           df_to_encode.drop(column, axis = 1, inplace = True)
           df_fin = pd.concat([df_to_encode, df_enc], axis = 1)
    
           
           return df_fin
    
    
    columns_to_one_hot_encode = ["type"]
    df = one_hot_encoder(columns_to_one_hot_encode,df)
    

    【讨论】:

    • 我已经使用了 get_Feature _names 但看起来它会被弃用。它说 get_feature_names 在 1.0 中已弃用,将在 1.2 中删除。
    • 好收获!我没有收到那个警告,但是在阅读了 SciKit 的文档之后,我认为您可以将其更改为:get_feature_names_out()。
    【解决方案2】:

    你不需要sklearn,你可以简单地使用pandas.get_dummies

    import pandas as pd
    
    def one_hot_encoder (features, df_to_encode):
        """encoder to encoder  
    
        Parameters:
        features (list): features to normalise
        df_to_encode (pandas dataframe): dataframe to encode
    
        Returns:
        dataframe: dataframe to encode 
        """
        return pd.get_dummies(df_to_encode, columns=features)
    
    columns_to_one_hot_encode = ["type"]
    df = one_hot_encoder(columns_to_one_hot_encode, df)
    

    【讨论】:

    • get_dummies 和 scikits OneHotEncoder 有什么区别?
    • @resolver101 你是什么意思?它们是相同概念的两个不同库上的两种不同实现。但是,如果您仍然使用pandas,则使用pandas.get_dummies 会更容易。如您所见,此解决方案比其他解决方案简单得多。我不知道是什么让你改变主意并接受另一个。
    • @HarrPlotter 没错,对于简单的转换,您可以轻松地使用 get.dummies()。然而,正如本文*中所述,OneHotEncoder() 比 get_dummies 有一些优势。在我看来,主要的一个事实是您可以轻松地将 OneHotEncoder 对象应用于使用相同类别和结果的测试数据。鉴于该数据集用于 Kaggle 比赛,我认为 OneHotEncoder() 是更明智的选择。 * stackoverflow.com/questions/36631163/…
    猜你喜欢
    • 2016-06-21
    • 2019-11-03
    • 2017-05-10
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多