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

2024-09-29 23:22:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个表,其中一列是二进制特性的数组,当该特性存在时,它们就在那里。你知道吗

我想在这些行上训练一个逻辑模型,但是无法获得所需格式的数据,其中每个特征值都是它自己的一列,值为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

似乎会有一些内置的功能来实现这一点,但我想不出这个转换是什么来做一个更好的搜索我自己。你知道吗


Tags: 数据模型id格式二进制数组特性逻辑
3条回答

方法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

另一种方法是循环遍历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

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

相关问题 更多 >

    热门问题