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

What's the best way to transform Array values in one column to columns of the original DataFrame?

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

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

示例:

id    feature values
1     ['HasPaws', 'DoesBark', 'CanFetch']
2     ['HasPaws', 'CanClimb', 'DoesMeow']

我想把它变成

的格式
id    HasPaws    DoesBark    CanFetch    CanClimb    DoesMeow
1     1          1           1           0           0
2     1          0           0           1           0

似乎内置了一些功能来实现这一点,但我想不出这种转换叫什么来做我自己更好的搜索。

您可以先将列表转换为列,然后使用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

另一种选择是遍历 feature values 列,并从每个单元格构建一个系列,并将列表中的值作为索引。这样,pandas 会将系列扩展为 index 为 headers:

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

方法一

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

方法二

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

方法三

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