将包含pandas Series的列转换为特征。

3

我的数据框如下:

            a
0     [8, 10]
1  [12, 7, 9]

正如你所看到的,列a包含了一个列表。该列表中的数字在我们的领域内具有意义,我想将它们用作特征。我的预期输出如下:

   Tag_7  Tag_8  Tag_9  Tag_10  Tag_12
0      0      1      0       1       0
1      1      0      1       0       1

我在互联网上找到了一些方法,它们符合我的期望,但是这些方法存在执行时间问题。其中一个方法如下:

pd.get_dummies(df.a.apply(pd.Series).stack().astype(int), prefix='Tag').sum(level=0)

我认为这种方法对于小型数据集非常有用。但对我的情况来说并不适用。我需要帮助。提前感谢。祝你拥有愉快的一天。


也许 pd.Series(['|'.join(map(str, x)) for x in df['a']]).str.get_dummies().add_prefix('Tag_') - Chris Adams
2个回答

2

尝试使用 scikit-learn,看看它能否帮助您。

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
cols = np.unique(np.concatenate(df.a))
df_final = pd.DataFrame(mlb.fit_transform(df.a), columns=cols).add_prefix('T_')

Out[213]:
   T_7  T_8  T_9  T_10  T_12
0    0    1    0     1     0
1    1    0    1     0     1

如果您需要压榨每一毫秒,请使用chain.from_iterablenp.concatenate更快,并使用np.char.addT_添加到列名中。

from sklearn.preprocessing import MultiLabelBinarizer
from itertools import chain

mlb = MultiLabelBinarizer()
cols = np.char.add('T_', np.unique(list(chain.from_iterable(df.a))).astype(str))
df_final = pd.DataFrame(mlb.fit_transform(df.a), columns=cols)

感谢您的回答。我认为这个解决方案更好一些,链接是https://dev59.com/rFcO5IYBdhLWcg3wvEGK#45313942。 - Fatih Taşdemir

0
有点黑客技巧,但你可以这样做:
df['bitsum'] = df['input'].apply(lambda lst: sum(1 << x for x in lst))
pd.Series(np.array(list(map(lambda x: f'{x:b}', df['bitsum'])))).apply(lambda x: x[::-1]).str.split('')

不确定它是否更快。如果您知道有多少个特征,您可以将1 << x替换为1 << (n_max - x),从而a)摆脱字符串反转apply(lambda x: x[::-1]),b)使用bin而不是lambda x: f'{x:b}',这也可能更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接