[英]Faster way to count total occurrences of values in a column of lists in 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()
我試圖在外部編寫一個函數來遍歷列表並找到計數,但這也很慢。
有什么辦法可以修改此數據或在熊貓中使用功能類似於df.groupby.count()
的函數?
我確實在Google和stackoverflow上搜索了一個半小時,但沒有一個答案具有更好的性能。 我已經嘗試了很長時間,想出一種方法來弄平列表,或者找到一種以更快的速度映射計數的方法(反復遍歷50萬行,每個列表的長度各不相同,有些可以長達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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.