Pandas : 对列表的每个元素使用 groupby

Pandas : Use groupby on each element of list

也许我漏掉了显而易见的东西。

我有一个 pandas 数据框,如下所示:

   id        product              categories
    0        Silmarillion         ['Book', 'Fantasy']
    1        Headphones           ['Electronic', 'Material']
    2        Dune                 ['Book', 'Sci-Fi']

我想用groupby函数统计categories列中每个元素出现的次数,所以这里的结果是

Book       2
Fantasy    1
Electronic 1
Material   1
Sci-Fi     1

但是,当我尝试使用 groupby 函数时,pandas 会计算整个列表的出现次数,而不是将其元素分开。我尝试了多种不同的方法来处理这个问题,使用元组或拆分,但到目前为止我一直没有成功。

试试这个:

In [58]: df['categories'].apply(pd.Series).stack().value_counts()
Out[58]:
Book          2
Fantasy       1
Electronic    1
Sci-Fi        1
Material      1
dtype: int64

您可以通过堆叠记录来规范化记录,然后调用 value_counts():

pd.DataFrame(df['categories'].tolist()).stack().value_counts()
Out: 
Book          2
Fantasy       1
Material      1
Sci-Fi        1
Electronic    1
dtype: int64

您也可以直接在列表上调用 pd.value_counts
您可以通过 numpy.concatenateitertools.chaincytoolz.concat

生成适当的列表
from cytoolz import concat
from itertools import chain

cytoolz.concat

pd.value_counts(list(concat(df.categories.values.tolist())))

itertools.chain

pd.value_counts(list(chain(*df.categories.values.tolist())))

numpy.unique + numpy.concatenate

u, c = np.unique(np.concatenate(df.categories.values), return_counts=True)
pd.Series(c, u)

全部产量

Book          2
Electronic    1
Fantasy       1
Material      1
Sci-Fi        1
dtype: int64

时间测试