我有一个数据框,其中一列是 short_names
。 short_names
由 2-5 个字母组成 => BG
,OP
,LE
,WEL
,LC
。每行可以有任意数量的名称。
我正在尝试使用 MultiLabelBinarizer
将名称转换为单独的列,这样如果行具有相似的名称,那么列中将有 1
one_hot = MultiLabelBinarizer()
one_hot.fit_transform(df['short_name'])
one_hot.classes__
因为其中一行中有一个 '-' 导致错误 TypeError: 'float' object is not iterable
,我使用了
df['short_names']= df['short_names'].astype(str)
现在的问题是类输出是字母而不是短名称,即 A
、B
、C
而不是 BG
OP
最佳答案
我认为需要dropna
删除missing values与 split
如有必要:
df = pd.Series({0: np.nan, 1: 'CE', 2: 'NPP', 4: 'SE, CB, CBN, OOM, BCI', 5: 'RCS'})
.to_frame('short_name')
print (df)
short_name
0 NaN
1 CE
2 NPP
4 SE, CB, CBN, OOM, BCI
5 RCS
from sklearn.preprocessing import MultiLabelBinarizer
one_hot = MultiLabelBinarizer()
a = one_hot.fit_transform(df['short_name'].dropna().str.split(', '))
print (a)
[[0 0 0 1 0 0 0 0]
[0 0 0 0 1 0 0 0]
[1 1 1 0 0 1 0 1]
[0 0 0 0 0 0 1 0]]
print(one_hot.classes_ )
['BCI' 'CB' 'CBN' 'CE' 'NPP' 'OOM' 'RCS' 'SE']
如果要输出DataFrame
:
df = pd.DataFrame(a, columns=one_hot.classes_ )
print (df)
BCI CB CBN CE NPP OOM RCS SE
0 0 0 0 1 0 0 0 0
1 0 0 0 0 1 0 0 0
2 1 1 1 0 0 1 0 1
3 0 0 0 0 0 0 1 0
另一种解决方案是用 fillna
替换 缺失值
:
from sklearn.preprocessing import MultiLabelBinarizer
one_hot = MultiLabelBinarizer()
a = one_hot.fit_transform(df['short_name'].fillna('missing').str.split(', '))
print (a)
[[0 0 0 0 0 0 0 0 1]
[0 0 0 1 0 0 0 0 0]
[0 0 0 0 1 0 0 0 0]
[1 1 1 0 0 1 0 1 0]
[0 0 0 0 0 0 1 0 0]]
print(one_hot.classes_ )
['BCI' 'CB' 'CBN' 'CE' 'NPP' 'OOM' 'RCS' 'SE' 'missing']
df = pd.DataFrame(a, columns=one_hot.classes_ )
print (df)
BCI CB CBN CE NPP OOM RCS SE missing
0 0 0 0 0 0 0 0 0 1
1 0 0 0 1 0 0 0 0 0
2 0 0 0 0 1 0 0 0 0
3 1 1 1 0 0 1 0 1 0
4 0 0 0 0 0 0 1 0 0
关于python - MultiLabelBinarizer 以字母而不是类别输出类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51335535/