2

我正在尝试将数据列表中包含列表的数据输入到机器学习算法中:

例如,患者可能有几种药物,并且对药物的几种反应他们也可能有名字。因此,如果他们服用超过 1 种药物,它将以 2 种或更多的形式出现。他们只有一个名字。

我相信 one-hot 编码是正确的方法。

这是我到目前为止所做的:

我有一个数据框:

df = pandas.DataFrame([{'drug': ['drugA','drugB'], 'patient': 'john'}, {'drug': ['drugC','drugD'], 'patient': 'angel'}])

             drug patient
0  [drugA, drugB]    john
1  [drugC, drugD]   angel

我想得到类似的东西:

  drugA  drugB drugC drugD patient
0  1       1     0     0     john
0  0       0     1     1     angel

我试过这个:

pandas.get_dummies(df.apply(pandas.Series).stack()).sum(level=0)

但得到:

TypeError: unhashable type: 'list'
4

2 回答 2

2

大量借鉴这个答案,这是一种方法:

df = pd.DataFrame([{'drug': ['drugA','drugB'], 'patient': 'john'}, 
                   {'drug': ['drugC','drugD'], 'patient': 'angel'}])
s = df.drug
      .apply(lambda x: pd.Series(x))
      .unstack()
df2 = df.join(pd.DataFrame(s.reset_index(level=0, drop=True)))
        .drop('drug',1)
        .rename(columns={0:'drug'})
df2.merge(pd.get_dummies(df2.drug), left_index=True, right_index=True)
   .drop('drug',1)

输出:

  patient  drugA  drugB  drugC  drugD
0    john    1.0    0.0    0.0    0.0
0    john    0.0    1.0    0.0    0.0
0    john    1.0    0.0    0.0    0.0
0    john    0.0    1.0    0.0    0.0
1   angel    0.0    0.0    1.0    0.0
1   angel    0.0    0.0    0.0    1.0
1   angel    0.0    0.0    1.0    0.0
1   angel    0.0    0.0    0.0    1.0
于 2017-04-23T02:12:23.787 回答
1

利用:

df1 = pd.get_dummies(pd.DataFrame(df.pop('drug').values.tolist()), prefix='', prefix_sep='')
        .groupby(axis=1, level=0).max()

df1 = pd.concat([df1, df], axis=1)
print (df1)
   drugA  drugB  drugC  drugD patient
0      1      1      0      0    john
1      0      0      1      1   angel
df1 = pd.get_dummies(pd.DataFrame(df['drug'].values.tolist()), prefix='', prefix_sep='') \
        .groupby(axis=1, level=0).max()

df1 = pd.concat([df1, df.drop('drug', axis=1)], axis=1)
print (df1)
   drugA  drugB  drugC  drugD patient
0      1      1      0      0    john
1      0      0      1      1   angel

df1 = df.pop('drug').astype(str).replace(['\[','\]', "'", "\s+"], '', regex=True)
                .str.get_dummies(',')
df1 = pd.concat([df1, df], axis=1)
print (df1)
   drugA  drugB  drugC  drugD patient
0      1      1      0      0    john
1      0      0      1      1   angel
df1 = df['drug'].astype(str).replace(['\[','\]', "'", "\s+"], '', regex=True)
                .str.get_dummies(',')
df1 = pd.concat([df1, df.drop('drug', axis=1)], axis=1)
print (df1)
   drugA  drugB  drugC  drugD patient
0      1      1      0      0    john
1      0      0      1      1   angel
于 2017-04-23T05:55:26.953 回答