将一列中的数组值转换为原始DataFrame的列的最佳方法是什么?

时间:2016-11-07 21:58:19

标签: python pandas dataframe logistic-regression

我有一个表,其中一列是二进制特征数组,当存在该特征时它们就在那里。

我想在这些行上训练逻辑模型,但不能以所需的格式获取数据,其中每个特征值是它自己的具有1或0值的列。

示例:

one_to_99 ::= tens
            | tens one_to_9
            | tens HYPHEN one_to_9
            ;

我希望将其格式化为

DbContext.Database.EnsureCreate()

似乎会内置一些功能来实现这一目标,但我无法想象这个转换被称为什么来自己做更好的搜索。

3 个答案:

答案 0 :(得分:4)

您可以先将列表转换为列,然后使用get_dummies()方法:

In [12]: df
Out[12]:
   id                 feature_values
0   1  [HasPaws, DoesBark, CanFetch]
1   2  [HasPaws, CanClimb, DoesMeow]

In [13]: (pd.get_dummies(df.set_index('id').feature_values.apply(pd.Series),
    ...:                 prefix='', prefix_sep='')
    ...:    .reset_index()
    ...: )
Out[13]:
   id  HasPaws  CanClimb  DoesBark  CanFetch  DoesMeow
0   1        1         0         1         1         0
1   2        1         1         0         0         1

答案 1 :(得分:3)

另一种选择是循环遍历feature values列,并使用列表中的值作为索引从每个单元格构造一个序列。通过这种方式,pandas会将系列扩展为数据框,其中index为标题:

pd.concat([df['id'], 
          (df['feature values'].apply(lambda lst: pd.Series([1]*len(lst), index=lst))
          .fillna(0)], axis=1)

enter image description here

答案 2 :(得分:2)

方法1

pd.concat([df['id'], df['feature values'].apply(pd.value_counts)], axis=1).fillna(0)

方法2

df.set_index('id').squeeze().apply(pd.value_counts).reset_index().fillna(0)

方法3

pd.concat([pd.Series(1, f, name=i) for _, (i, f) in df.iterrows()],
          axis=1).T.fillna(0).rename_axis('id').reset_index()

enter image description here