一热编码的多级列数据[英] One-hot encoding multi-level column data

本文是小编为大家收集整理的关于一热编码的多级列数据的处理方法,想解了一热编码的多级列数据的问题怎么解决?一热编码的多级列数据问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有以下数据框架,其中有有关不同主题功能的记录:

ID   Feature
-------------------------
1    A
1    B
2    A
1    A
3    B
3    B
1    C
2    C
3    D

我想获得另一个(汇总?)的数据框架,其中每一行代表一个特定的主题,并且有一个详尽的列表所有单壁编码功能:

ID   FEATURE_A FEATURE_B FEATURE_C FEATURE D
--------------------------------------------
1    1         1         1         0
2    1         0         1         0
3    0         1         0         0

如何在python(pandas)中实施?

奖金:如何实现功能列包含事件编号的版本,而不仅仅是二进制标志?

推荐答案

使用 >带有 get_dummies " http://pandas.pydata.org/pandas-docs/stable/generated/pandas.dataframe.groupby.html" rel =" noreferrer"> groupby 和聚集

df =df[['ID']].join(pd.get_dummies(df['Feature']).add_prefix('FEATURE_')).groupby('ID').max()
print (df)
    FEATURE_A  FEATURE_B  FEATURE_C  FEATURE_D
ID                                            
1           1          1          1          0
2           1          0          1          0
3           0          1          0          1

细节:

print (pd.get_dummies(df['Feature']))
   A  B  C  D
0  1  0  0  0
1  0  1  0  0
2  1  0  0  0
3  1  0  0  0
4  0  1  0  0
5  0  1  0  0
6  0  0  1  0
7  0  0  1  0
8  0  0  0  1

MultiLabeLeleBinarizarizerizer 和构造函数:

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df1 = pd.DataFrame(mlb.fit_transform(df['Feature']),
                   columns=['FEATURE_' + x for x in mlb.classes_], 
                   index=df.ID).max(level=0)
print (df1)
    FEATURE_A  FEATURE_B  FEATURE_C  FEATURE_D
ID                                            
1           1          1          1          0
2           1          0          1          0
3           0          1          0          1

时间:

np.random.seed(123)
N = 100000
L = list('abcdefghijklmno'.upper()) 
df = pd.DataFrame({'Feature': np.random.choice(L, N),
                   'ID':np.random.randint(10000,size=N)})

def jez(df):
    mlb = MultiLabelBinarizer()
    return pd.DataFrame(mlb.fit_transform(df['Feature']),
                   columns=['FEATURE_' + x for x in mlb.classes_], 
                   index=df.ID).max(level=0)


#jez1
In [464]: %timeit (df[['ID']].join(pd.get_dummies(df['Feature']).add_prefix('FEATURE_')).groupby('ID').max())
10 loops, best of 3: 39.3 ms per loop

In [465]: %timeit (jez(df))
10 loops, best of 3: 138 ms per loop

#Scott Boston1
In [466]: %timeit (df.set_index('ID')['Feature'].str.get_dummies().add_prefix('FEATURE_').max(level=0))
1 loop, best of 3: 1.03 s per loop

#wen1
In [467]: %timeit (pd.crosstab(df.ID,df.Feature).gt(0).astype(int).add_prefix('FEATURE '))
1 loop, best of 3: 383 ms per loop

#wen2
In [468]: %timeit (pd.get_dummies(df.drop_duplicates().set_index('ID')).sum(level=0))
10 loops, best of 3: 47 ms per loop

警告

鉴于Feature和ID的比例,结果无法解决性能,这将影响其中一些解决方案的时间.

其他推荐答案

另一个类似选项是使用set_index,.str(字符串访问者),get_dummies和max使用level=0参数,然后使用add_prefix更改列名:

df.set_index('ID')['Feature'].str.get_dummies().add_prefix('FEATURE_').max(level=0)

输出:

    FEATURE_A  FEATURE_B  FEATURE_C  FEATURE_D
ID                                            
1           1          1          1          0
2           1          0          1          0
3           0          1          0          1

其他推荐答案

使用pd.crosstab

pd.crosstab(df.ID,df.Feature).gt(0).astype(int).add_prefix('FEATURE ')
Out[805]: 
Feature  FEATURE A  FEATURE B  FEATURE C  FEATURE D
ID                                                 
1                1          1          1          0
2                1          0          1          0
3                0          1          0          1

或使用drop_duplicates然后get_dummies

pd.get_dummies(df.drop_duplicates().set_index('ID')).sum(level=0)
Out[808]: 
    Feature_A  Feature_B  Feature_C  Feature_D
ID                                            
1           1          1          1          0
2           1          0          1          0
3           0          1          0          1

附加答案: 如何实现功能列包含事件编号的版本,而不仅仅是二进制标志?

option1

pd.crosstab(df.ID,df.Feature)
Out[809]: 
Feature  A  B  C  D
ID                 
1        2  1  1  0
2        1  0  1  0
3        0  2  0  1

选项2

pd.get_dummies(df.set_index('ID')).sum(level=0)

本文地址:https://www.itbaoku.cn/post/1728161.html