Pandas 为一个热编码展开一系列列表?

Pandas 为一个热编码展开一系列列表?,pandas,one-hot-encoding,Pandas,One Hot Encoding,我正在从一个有许多数组类型列的数据库中读取数据,pd.read\u sql为我提供了一个数据框架,其中的列是dtype=object,包含列表 我想要一种有效的方法来查找哪些行具有包含某些元素的数组: s = pd.Series( [[1,2,3], [1,2], [99], None, [88,2]] ) print s 1-用于ML应用程序的热编码功能表,我希望最后得到如下表: contains_1 contains_2, contains_3 contains_88 0

我正在从一个有许多数组类型列的数据库中读取数据,pd.read\u sql为我提供了一个数据框架,其中的列是
dtype=object
,包含列表

我想要一种有效的方法来查找哪些行具有包含某些元素的数组:

s = pd.Series(
    [[1,2,3], [1,2], [99], None, [88,2]]
)
print s

1-用于ML应用程序的热编码功能表,我希望最后得到如下表:

   contains_1 contains_2, contains_3 contains_88
0  1          ...
1  1
2  0
3  nan
4  0
...
我可以展开一系列数组,如下所示:

s2 = s.apply(pd.Series).stack()

0  0     1.0
   1     2.0
   2     3.0
1  0     1.0
   1     2.0
2  0    99.0
4  0    88.0
   1     2.0
这让我能够找到满足某些测试的元素:

>>> print s2[(s2==2)].index.get_level_values(0)
Int64Index([0, 1, 4], dtype='int64')
呜!此步骤:

s.apply(pd.Series).stack()
生成一个很好的中间数据结构(s2),可以快速迭代每个类别。但是,
apply
步骤非常慢(对于一个包含500k行、包含10个项目列表的单列来说,需要10秒),而且我有很多列


更新:开始时,将数据放在一系列列表中似乎很慢。在SQL端执行展开看起来很棘手(我有许多列要展开)。有没有办法将阵列数据拉入更好的结构

import numpy as np
import pandas as pd
import cytoolz

s0 = s.dropna()
v = s0.values.tolist()
i = s0.index.values
l = [len(x) for x in v]
c = cytoolz.concat(v)
n = np.append(0, np.array(l[:-1])).cumsum().repeat(l)
k = np.arange(len(c)) - n

s1 = pd.Series(c, [i.repeat(l), k])
更新:什么对我有用

def unroll(s):
    s = s.dropna()
    v = s.values.tolist()
    c = pd.Series(x for x in cytoolz.concat(v)) # 16 seconds!
    i = s.index
    lens = np.array([len(x) for x in v]) #s.apply(len) is slower
    n = np.append(0, lens[:-1]).cumsum().repeat(lens)
    k = np.arange(sum(lens)) - n

    s = pd.Series(c)
    s.index = [i.repeat(lens), k]

    s = s.dropna()
    return s
应能够替换:

    s = pd.Series(c)
    s.index = [i.repeat(lens), k]
与:

但这不起作用。(说没问题)

谢谢——我添加了几个调整。把你的答案写进去。cytoolz.concat比.apply(系列)快一个数量级或数量级,但对于我的应用程序,每列仍约为16秒。
    s = pd.Series(c)
    s.index = [i.repeat(lens), k]
        s = pd.Series(c, index=[i.repeat(lens), k])