程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

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

发布于2019-11-11 09:33     阅读(1477)     评论(0)     点赞(2)     收藏(5)


我有一个熊猫数据框:

   |     items
--------------
0  |    [a]
1  |    [a, b]
2  |    [d, e, f,f]
3  |    [d, f, e]
4  |    [c, a, b]

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

    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

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

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


import pandas as pd
from collections import Counter,defaultdict

df = pd.DataFrame({'items':[['a'],['a','b'],
                            ['d','e','f','f'],['d','f','e'],
                            ['c','a','b']]})


alist = sum(sum(df.values.tolist(),[]),[]) # flatten the list
unique_list = sorted(set(alist)) # get unique value for column names
unique_list

b = defaultdict(list)
for row in sum(df.values.tolist(),[]):
    counts = Counter(row)
    for name in unique_list:
        if name in counts.keys():
            b[name].append(counts[name])
        else:
            b[name].append(0)

pd.DataFrame(b)

解决方案


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

您可以使用Series.explode,然后crosstab在这里。


ii = df['items'].explode()

pd.crosstab(ii.index, ii)

items  a  b  c  d  e  f
row_0
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

性能

df = pd.concat([df]*10_000, ignore_index=True)

In [91]: %timeit chris(df)
1.07 s ± 5.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [92]: %timeit user11871120(df)
15.8 s ± 124 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [93]: %timeit ricky_kim(df)
56.4 s ± 1.1 s per loop (mean ± std. dev. of 7 runs, 1 loop each)


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/149777/bc288645ac40fe1f0ad6/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

2 0
收藏该文
已收藏

评论内容:(最多支持255个字符)