将行列表转换为Pandas中的频率表

use*_*120 5 python python-3.x pandas

我有一个熊猫数据框:

   |     items
--------------
0  |    [a]
1  |    [a, b]
2  |    [d, e, f,f]
3  |    [d, f, e]
4  |    [c, a, b]
Run Code Online (Sandbox Code Playgroud)

我想计算列表中每个项目的频率,并构建一个如下表:

    a|  b|  c|  d|  e|  f
-------------------------
0|  1|  0|  0|  0|  0|  0
1|  1|  1|  0|  0|  0|  0
2|  0|  0|  0|  1|  1|  2
3|  0|  0|  0|  1|  1|  1
4|  1|  1|  1|  0|  0|  0
Run Code Online (Sandbox Code Playgroud)

我看着pandas.explode,但我不认为这是我想要的。

我可以在下面做类似的事情。但是我觉得可能会有更有效的方法来做到这一点。我大约有350万行。

   |     items
--------------
0  |    [a]
1  |    [a, b]
2  |    [d, e, f,f]
3  |    [d, f, e]
4  |    [c, a, b]
Run Code Online (Sandbox Code Playgroud)

use*_*203 4

由于子列表中有重复项,因此这比 更成pivot问题get_dummies,但您需要首先扩展子列表。

\n\n

您可以Series.explode在此处使用后面的内容crosstab

\n\n
\n\n
ii = df[\'items\'].explode()\n\npd.crosstab(ii.index, ii)\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n

items  a  b  c  d  e  f\nrow_0\n0      1  0  0  0  0  0\n1      1  1  0  0  0  0\n2      0  0  0  1  1  2\n3      0  0  0  1  1  1\n4      1  1  1  0  0  0\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

表现

\n\n
df = pd.concat([df]*10_000, ignore_index=True)\n\nIn [91]: %timeit chris(df)\n1.07 s \xc2\xb1 5.3 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n\nIn [92]: %timeit user11871120(df)\n15.8 s \xc2\xb1 124 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n\nIn [93]: %timeit ricky_kim(df)\n56.4 s \xc2\xb1 1.1 s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n
Run Code Online (Sandbox Code Playgroud)\n