熊猫:在列表的每个元素上使用groupby

时间:2017-01-21 13:59:46

标签: python python-3.x pandas numpy pandas-groupby

也许我错过了显而易见的事情。

我有一个像这样的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会计算整个列表的出现次数而不是分隔其元素。我尝试过多种不同的处理方法,使用元组或拆分,但到目前为止我还没有成功。

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

您也可以直接在列表中拨打the requested URL /working.php was not found on this server. 您可以通过pd.value_countsnumpy.concatenateitertools.chain

生成相应的列表
cytoolz.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)

时间测试

enter image description here

答案 2 :(得分:4)

试试这个:

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