一列中的一种热编码多个分类数据

时间:2020-06-16 12:07:16

标签: python one-hot-encoding

初学者在这里。我想对一列中包含多个分类数据的数据框使用一种热编码。我的数据框看起来像这样,尽管该栏中有更多内容使我无法手动完成:

Title       column
Movie 1   Action, Fantasy
Movie 2   Fantasy, Drama
Movie 3   Action
Movie 4   Sci-Fi, Romance, Comedy
Movie 5   NA
etc.

我想要的输出:

 Title     Action  Fantasy  Drama  Sci-Fi  Romance  Comedy
Movie 1     1       1        0      0        0       0
Movie 2     0       1        1      0        0       0
Movie 3     1       0        0      0        0       0
Movie 4     0       0        0      1        1       1
Movie 5     0       0        0      0        0       0  
etc.

谢谢!

2 个答案:

答案 0 :(得分:0)

将输入数据视为:

Maximum pressure  Minimum pressure  Day
12                   21             2013/03/12
25                   14             2015/04/16
27                   18             2010/09/21 

df.loc[max(df['Maximum pressure '] -df['Minimum pressure ']),'Day']

此代码产生所需的输出:

import pandas as pd
data = {'Title': ['Movie 1', 'Movie 2', 'Movie 3', 'Movie 4', 'Movie 5'], 
        'column': ['Action, Fantasy', 'Fantasy, Drama', 'Action', 'Sci-Fi, Romance, Comedy', np.nan]}
df = pd.DataFrame(data)
df
    Title   column
0   Movie 1 Action, Fantasy
1   Movie 2 Fantasy, Drama
2   Movie 3 Action
3   Movie 4 Sci-Fi, Romance, Comedy
4   Movie 5 NaN

更新: 我在测试数据中添加了一个空值,并在解决方案的第一行中对其进行了适当处理。

答案 1 :(得分:0)

### Import libraries and load sample data

import numpy as np
import pandas as pd

data = {
    'Movie 1': ['Action, Fantasy'],
    'Movie 2': ['Fantasy, Drama'],
    'Movie 3': ['Action'],
    'Movie 4': ['Sci-Fi, Romance, Comedy'],
    'Movie 5': ['NA'],
}

df = pd.DataFrame.from_dict(data, orient='index')
df.rename(columns={0:'column'}, inplace=True)

在此阶段,我们的DataFrame如下所示:

           column
Movie 1    Action, Fantasy
Movie 2    Fantasy, Drama
Movie 3    Action
Movie 4    Sci-Fi, Romance, Comedy
Movie 5    NA

现在,我们要问的问题是-给定电影的“列”中是否出现了给定类型的单词(“子字符串”)?

为此,我们首先需要一个类型词列表:

### Join every string in every row, split the result, pull out the unique values.
genres = np.unique(', '.join(df['column']).split(', '))
### Drop 'NA'
genres = np.delete(genres, np.where(genres == 'NA'))

根据数据集的大小,这可能会在计算上造成巨大的成本。您提到您已经知道唯一值。因此,您只需手动定义可迭代的“类型”即可。

获取OneHotVectors:

for genre in genres:
    df[genre] = df['column'].str.contains(genre).astype('int')

df.drop('column', axis=1, inplace=True)

我们遍历每种流派,我们询问该流派是否存在于“ column”中,这会返回True或False,当我们转换为type('int')时会分别转换为1或0。

我们最终得到:

          Action    Comedy  Drama   Fantasy Romance Sci-Fi
Movie 1        1         0      0         1       0      0
Movie 2        0         0      1         1       0      0
Movie 3        1         0      0         0       0      0
Movie 4        0         1      0         0       1      1
Movie 5        0         0      0         0       0      0

相关问题