如何解析daframe中的多类别列?

时间:2019-04-12 15:17:09

标签: python machine-learning data-visualization data-cleaning

我有一个数据框,其中包含“ title”和“ cuisines”列,其中包含相似类别的多个值。如何解决它们并转换为数字形式?还有如何替换此类列中的nan值?

我考虑过尝试“一种热编码”,但这不必要地增加了列数。也许我希望所有类别都分开。 美食专栏提供220种独特美食,标题部分提供24种独特标题。

示例

enter image description here

1 个答案:

答案 0 :(得分:1)

好吧,有人可能会说,将一列热编码/分类列转换为数值并不会“不必要地”增加列数。.实际上,将所有不同类别真正分解为数值类是必要的值。

但是,如果要保留列数,则可以执行以下操作:将列中的所有唯一值都用作一个字典。然后使用字典将它们映射回该列。它还可以处理您的nan,但是您最终必须决定要对这些对象做什么:

给出:

import pandas as pd
import numpy as np

df = pd.DataFrame([['CASUAL DINING','Malwani, Goan, North Indian'],
                   ['CASUAL DINING,BAR','Malwani, Goan, North Indian'],
                   ['CASUAL DINING','Asian, Modern Indian, Japanese'],
                   ['QUICK BITES',np.nan],
                   ['CAFE','Bar Food'],
                   ['CASUAL DINING', 'South Indian, North Indian']], columns = ['TITLE','CUISINES']) 

输出:

print (df)
               TITLE                        CUISINES
0      CASUAL DINING     Malwani, Goan, North Indian
1  CASUAL DINING,BAR     Malwani, Goan, North Indian
2      CASUAL DINING  Asian, Modern Indian, Japanese
3        QUICK BITES                Tibetan, Chinese
4               CAFE                        Bar Food
5      CASUAL DINING      South Indian, North Indian

创建唯一值的字典:

title_unq = list(df['TITLE'].unique())
title_dict = {}
for idx, value in enumerate(title_unq):
    title_dict[value] = idx


cuisines_unq = list(df['CUISINES'].unique())
cuisines_dict = {}
for idx, value in enumerate(cuisines_unq):
    cuisines_dict[value] = idx       

输出:

print (title_dict)
{'CASUAL DINING': 0, 'CASUAL DINING,BAR': 1, 'QUICK BITES': 2, 'CAFE': 3}

print (cuisines_dict)
{'Malwani, Goan, North Indian': 0, 'Asian, Modern Indian, Japanese': 1, 'Tibetan, Chinese': 2, 'Bar Food': 3, 'South Indian, North Indian': 4}

然后使用这些值替换列中的值:

df['TITLE'] = df['TITLE'].map(title_dict)   
df['CUISINES'] = df['CUISINES'].map(cuisines_dict)    

输出:

print (df)
   TITLE  CUISINES
0      0         0
1      1         0
2      0         1
3      2         2
4      3         3
5      0         4