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

我有一个熊猫数据框:


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


白衣非少年
浏览 181回答 2
2回答

波斯汪

由于您的子列表中有重复项,因此这比 a 更成pivot问题get_dummies,但您需要先扩展您的子列表。您可以在此处使用Series.explode后跟crosstab。ii = df['items'].explode()pd.crosstab(ii.index, ii)items  a  b  c  d  e  frow_00      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表现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)

皈依舞

另一种使用applyand 的方法value_counts:df['items'].apply(pd.value_counts).fillna(0).astype(int)输出:   a  b  f  d  e  c0  1  0  0  0  0  01  1  1  0  0  0  02  0  0  2  1  1  03  0  0  1  1  1  04  1  1  0  0  0  1
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python