【问题标题】:Convert a column which contains pandas Series to features [duplicate]将包含熊猫系列的列转换为特征[重复]
【发布时间】:2020-06-16 19:09:34
【问题描述】:

我的数据框如下:

            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_')

标签: python pandas dataframe series


【解决方案1】:

有点hacking,但你可以这样做:

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 &lt;&lt; (n_max - x) 替换 1 &lt;&lt; x 等等 a) 摆脱字符串反转 apply(lambda x: x[::-1]),b) 使用 bin 而不是 lambda x: f'{x:b}',这似乎也更快.

【讨论】:

    【解决方案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
    

    如果您需要挤压每个ms,使用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)
    

    【讨论】:

    猜你喜欢
    • 2017-10-29
    • 2019-05-22
    • 2019-10-12
    • 2014-11-23
    • 1970-01-01
    相关资源
    最近更新 更多