为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白衣非少年 2022-04-27 13:46:44
我有一个熊猫数据框:   |     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|  01|  1|  1|  0|  0|  0|  02|  0|  0|  0|  1|  1|  23|  0|  0|  0|  1|  1|  14|  1|  1|  1|  0|  0|  0我看着pandas.explode但我不认为那是我想要的。我可以在下面做这样的事情。但我觉得可能有更有效的方法来做到这一点。我有大约 350 万行。import pandas as pdfrom collections import Counter,defaultdictdf = pd.DataFrame({'items':[['a'],['a','b'],                            ['d','e','f','f'],['d','f','e'],                            ['c','a','b']]})alist = sum(sum(df.values.tolist(),[]),[]) # flatten the listunique_list = sorted(set(alist)) # get unique value for column namesunique_listb = 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)
查看完整描述

2 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

由于您的子列表中有重复项,因此这比 a 更成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)


查看完整回答
反对 回复 2022-04-27
?
皈依舞

TA贡献1851条经验 获得超3个赞

另一种使用applyand 的方法value_counts:


df['items'].apply(pd.value_counts).fillna(0).astype(int)

输出:


   a  b  f  d  e  c

0  1  0  0  0  0  0

1  1  1  0  0  0  0

2  0  0  2  1  1  0

3  0  0  1  1  1  0

4  1  1  0  0  0  1


查看完整回答
反对 回复 2022-04-27
  • 2 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号