也许我错过了显而易见的事实.
我有一个像这样的pandas数据框:
id product categories 0 Silmarillion ['Book', 'Fantasy'] 1 Headphones ['Electronic', 'Material'] 2 Dune ['Book', 'Sci-Fi']
我想使用groupby函数来计算类别列中每个元素的出现次数,所以这里的结果将是
Book 2 Fantasy 1 Electronic 1 Material 1 Sci-Fi 1
但是,当我尝试使用groupby函数时,pandas会计算整个列表的出现次数而不是分隔其元素.我已经尝试了多种不同的处理方式,使用元组或拆分,但到目前为止我还没有成功.
您可以通过堆叠它们来规范化记录,然后调用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.concatenate
,itertools.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)
全部收益
Book 2 Electronic 1 Fantasy 1 Material 1 Sci-Fi 1 dtype: int64
时间测试