我有一个数据框,其中一列是short_names
。 short_names
由2-5个字母组成,名称=> BG
,OP
,LE
,WEL
,LC
。每行可以有任意数量的名称。
我正在尝试使用MultiLabelBinarizer
将名称转换为单独的列,这样,如果行的名称相似,则列中将为
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
>
答案 0 :(得分:1)
我认为需要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
另一种解决方案是将missing values
替换为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