更快地计算pandas中列表列中值的总出现次数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更快地计算pandas中列表列中值的总出现次数?相关的知识,希望对你有一定的参考价值。

我在pandas数据框中有一个列,其中包含大量标签列表:

>>> data['SPLIT'].head(10)
0    [33.23, 88.72, 38.93, E931.7, V09.0, 041.11, 5...
1    [99.04, 38.06, 39.57, 00.91, 55.69, V15.82, 27...
2    [96.04, 96.72, 401.9, 276.5, 584.9, 428.0, 507...
3    [96.6, 99.15, 99.83, V29.0, 765.15, 765.25, 77...
4    [96.71, 96.04, 54.12, 99.60, 38.93, 99.15, 53....
5    [88.72, 37.61, 39.61, 36.15, 36.12, 272.0, 401...
6    [38.93, 88.72, 37.31, 272.4, 719.46, 722.0, 31...
7    [88.72, 39.61, 35.71, 272.4, V12.59, 458.29, 7...
8    [97.44, 99.04, 88.56, 37.23, 39.95, 38.95, 00....
9    [00.14, 89.61, 39.95, E878.8, 244.9, 443.9, 18...

我想要做的是遍历所有这些列表以找到每个值的总出现次数,以便我可以找到50个最常出现的值。

这是我使用的代码,运行速度非常慢:

test = pd.Series(sum([item for item in data.SPLIT], [])).value_counts()

我试着在外面编写一个函数来遍历列表并查找计数,但这也很慢。

有什么方法可以修改这些数据或在pandas中使用与df.groupby.count()类似的性能的函数吗?

我在google和stackoverflow上搜索了半个小时,但没有一个答案有更好的性能。我已经尝试了很长一段时间来找出一种方法来压平列表或找到一种方法来以更好的速度映射计数(迭代500k行,每个列表的长度变化,有些可能长达512,其他短至2)。

答案

使用列表理解与展平而不是sum

test = pd.Series([x for item in data.SPLIT for x in item]).value_counts()

或者由chain.from_iterable压扁:

from itertools import chain

test = pd.Series(list(chain.from_iterable(data.SPLIT))).value_counts()

或者也使用collections.Counter

from itertools import chain
from collections import Counter

test = pd.Series(Counter(chain.from_iterable(data.SPLIT)))

要么:

import functools, operator

test = pd.Series(functools.reduce(operator.iconcat, data.SPLIT, [])).value_counts()

纯熊猫解决方案:

test = pd.DataFrame(data.SPLIT.values.tolist()).stack().value_counts()
另一答案

这个怎么样?

import pandas as pd

split = data["SPLIT"].apply(pd.Series)
split = split.rename(columns = lambda x : 'val_' + str(x))
split.melt(value_name="val").groupby(["val"]).size()

以上是关于更快地计算pandas中列表列中值的总出现次数?的主要内容,如果未能解决你的问题,请参考以下文章

根据第一列中的唯一值计算第二列中值的出现次数

使用 R 有效地计算列中单词列表的出现次数

计算列表列中两个元素的出现次数

Power BI DAX 度量:考虑视觉对象的筛选上下文,计算列中值的出现次数

按两列分组并计算 Pandas 中每个组合的出现次数

Pandas - 计算并获取列中字符串值的唯一出现次数