【问题标题】:How can I perform one-hot encoding on multiple categorical values (with unique values between 20 to 400) at once?如何一次对多个分类值(唯一值在 20 到 400 之间)执行单热编码?
【发布时间】:2023-01-10 06:55:17
【问题描述】:

我有一个文件“Person_details.csv”,它共有 507 列(变量/特征)和 50k 行。我有 7 个分类变量(['FirstRace','Languages', 'Ethnicity', 'City', 'Country', 'Month','Field'] 和 500 个数值变量(例如:['Person_ID','age' , '薪水', '经验', '身高', 等等]). 这7个分类变量(['FirstRace', 'Languages', 'Ethnicity', 'City', 'Country', 'Month',' Field']) 有 20 到 400 个唯一值,这将增加特征空间,因此我在使用以下代码执行单热编码时选择前 10 个唯一值。代码工作正常,但我正在对每个值执行一个热编码分别将 7 个分类变量保存在不同的文件中,然后将它们与主文件(Person_details.csv)连接起来。有没有一种方法可以同时对所有 7 个变量执行编码并将它们存储在一个文件中?任何帮助表示赞赏。提前致谢。

执行单热编码的代码:

import pandas as pd
    df = pd.read_csv("Person_details.csv", usecols= ['FirstRace','Languages', 'Ethnicity', 'City', 'Country', 'Month', 'Field'])
    for x in df.columns:
        #printing unique values
        print(x ,':', len(new_df[x].unique()))
    
    counts = df['FirstRace'].value_counts().sum()
    
    top_10_labels = [y for y in df.FirstRace.value_counts().sort_values(ascending=False).head(10).index]
    df=pd.get_dummies(df['FirstRace']).sample(10)
    
    
    
    def top_x(df2,variable,top_x_labels):
        for label in top_x_labels:
            df2[variable+'_'+label] = np.where(data[variable]==label,1,0)
    data = pd.read_csv("Person_details.csv",usecols = ['Person_ID','FirstRace'])
    top_x(data,'FirstRace',top_10_labels)
    data.to_csv(r'First_race.csv', index=False)

在上面的代码中,每次我替换分类变量并执行单热编码时,都会选择前 10 个唯一值并将它们保存在单独的 .csv 文件中。示例:我将“FirstRace”替换为“Languages”,然后替换为“Ethnicity”等。从“counts = df['FirstRace'].value_counts().sum()”行开始,直到最后一行我每次都替换列名时间并将每个分类变量的前 10 个唯一值保存在不同的文件中。

【问题讨论】:

  • 我仍然无法弄清楚。只是为了让这个问题简单化。我想对 7 个分类变量执行单热编码,选择前 10 个唯一值并将单热编码的前 10 列保存在文件中。任何帮助表示赞赏。谢谢

标签: python pandas dataframe categorical-data one-hot-encoding


【解决方案1】:

我能够一次对多个变量执行一个热编码,但我无法弄清楚如何将唯一值的名称添加为列名。它显示数字以及初始变量名称。

例子: 对于 Languages 变量,我想要一个热编码列名称作为 Languages_English、Languages_Spanish、...Languages_Italian(前 10 个值)。但我正在获取 Languages_1、Languages_2、...、Languages_10。我怎样才能得到正确的名字。

这是我正在使用的代码

data = pd.read_csv("Person_details.csv")
for column_name in data.columns:
    
    top_10 = data[column_name].value_counts().sort_values(ascending=False).head(10).index

    for number, value in enumerate(top_10):
        data[column_name + '_' + str(number)] = np.where(data[column_name].index==value, 1, 0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 2020-10-06
    • 2017-06-08
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多