一热编码

时间:2016-12-14 19:41:24

标签: python pandas scikit-learn one-hot-encoding

我有一个像这样的csv文件:

text short_text category
...  ...        ...

我打开了文件并将其存储在Pandas数据框中,如下所示:

filepath = 'path/data.csv'
train = pd.read_csv(filepath, header=0, delimiter=",")

每条记录的类别字段包含一个类别列表,这是一个字符串,每个类别都是单引号,如下所示:

['Adult'   'Aged'   'Aged   80 and over'   'Benzhydryl Compounds/*therapeutic use'   'Cresols/*therapeutic use'   'Double-Blind Method'   'Female'   'Humans'   'Male'   'Middle Aged'   'Muscarinic Antagonists/*therapeutic use'   '*Phenylpropanolamine'   'Tolterodine Tartrate'   'Urinary Incontinence/*drug therapy']

我希望通过使用单热编码将其用于机器学习。我知道我可以使用scikit-learn的sklearn.preprocessing包来实现它,但我不确定如何做到这一点。

注意:我没有列出所有可能的类别。

2 个答案:

答案 0 :(得分:0)

您可以使用pd.value_counts来提供帮助

df = pd.DataFrame(dict(
        text=list('ABC'),
        short_text=list('XYZ'),
        category=[list('abc'), list('def'), list('abefxy')]
    ))

df.category.apply(pd.value_counts).fillna(0).astype(int)

enter image description here

或一切

pd.concat(
    [df.drop('category', 1),
     df.category.apply(pd.value_counts).fillna(0).astype(int)],
    axis=1
)

enter image description here

答案 1 :(得分:0)

作为piRSquared's answer的替代方案,您可以使用sklearn.preprocessing.MultiLabelBinarizer

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
pd.concat([
    df.drop('category', 1),
    pd.DataFrame(mlb.fit_transform(df['category']), columns=mlb.classes_),
], 1)

在我的测试中,这速度提高了几个数量级,特别是对于大型数据集。