programing

판다의 발생을 세는 가장 효율적인 방법은 무엇일까요?

projobs 2023. 1. 24. 08:33
반응형

판다의 발생을 세는 가장 효율적인 방법은 무엇일까요?

큰 데이터 프레임(약 1200만 행)을 가지고 있다df:

df.columns = ['word','documents','frequency']

다음은 시기적절하게 실행되었습니다.

word_grouping = df[['word','frequency']].groupby('word')
MaxFrequency_perWord = word_grouping[['frequency']].max().reset_index()
MaxFrequency_perWord.columns = ['word','MaxFrequency']

그러나 이 작업을 실행하는 데 예상외로 오랜 시간이 걸립니다.

Occurrences_of_Words = word_grouping[['word']].count().reset_index()

내가 여기서 뭘 잘못하고 있는 거지?대규모 데이터 프레임에서 발생하는 횟수를 계산하는 더 좋은 방법이 있습니까?

df.word.describe()

꽤 잘 뛰었기 때문에, 나는 정말 예상하지 못했어요.Occurrences_of_WordsData Frame을 구축하는 데 시간이 오래 걸립니다.

생각합니다df['word'].value_counts()도움이 될 겁니다그룹별 기계를 건너뛰면 시간을 절약할 수 있습니다.왜 그랬는지 모르겠다count보다 훨씬 느릴 것이다max둘 다 값이 누락되지 않도록 하기 위해 시간이 걸립니다.(과 비교)size.)

어쨌든 value_counts는 당신의 말과 같이 오브젝트 타입을 처리하도록 특별히 최적화되어 있기 때문에 당신은 그 이상을 할 수 있을지 의문입니다.

panda dataFrame에서 한 열의 범주형 데이터의 빈도를 계산하려는 경우:df['Column_Name'].value_counts()

- 출처.

이전 답변에 대한 추가 사항입니다.실제 데이터를 다룰 때 null 값이 있을 수 있으므로 옵션을 사용하여 카운트에 포함시키는 것도 유용합니다.dropna=False(기본값은 입니다).

예:

>>> df['Embarked'].value_counts(dropna=False)
S      644
C      168
Q       77
NaN      2

발생 횟수를 세는 다른 가능한 접근법은 (i)를 사용하는 것일 수 있다.Counter부터collections모듈, (ii)unique부터numpy라이브러리 및 (iii)groupby+sizepandas.

사용방법collections.Counter:

from collections import Counter
out = pd.Series(Counter(df['word']))

사용방법numpy.unique:

import numpy as np
i, c = np.unique(df['word'], return_counts = True)
out = pd.Series(c, index = i)

사용방법groupby+size:

out = pd.Series(df.index, index=df['word']).groupby(level=0).size()

의 매우 좋은 특징 중 하나는value_counts위의 방법에서 누락된 것은 카운트를 정렬한다는 것입니다.카운트를 정렬해야 하는 경우value_counts단순성과 성능을 고려할 때 최적의 방법입니다(특히 매우 큰 시리즈의 경우 다른 방법보다 약간 앞서는 수준이지만).

벤치마크

(카운트를 정렬하는 것이 중요하지 않은 경우):

런타임은 DataFrame 열/시리즈에 저장된 데이터에 따라 달라집니다.

시리즈가 dtype 객체인 경우 매우 큰 시리즈에 대한 가장 빠른 방법은 다음과 같습니다.collections.Counter단, 일반적으로는value_counts경쟁이 치열합니다.

여기에 이미지 설명 입력

단, dtype int일 경우 가장 빠른 방법은numpy.unique:

여기에 이미지 설명 입력

그림을 생성하는 데 사용되는 코드:

import perfplot
import numpy as np
import pandas as pd
from collections import Counter

def creator(n, dt='obj'):
    s = pd.Series(np.random.randint(2*n, size=n))
    return s.astype(str) if dt=='obj' else s
    
def plot_perfplot(datatype):
    perfplot.show(
        setup = lambda n: creator(n, datatype),
        kernels = [lambda s: s.value_counts(),
                   lambda s: pd.Series(Counter(s)),
                   lambda s: pd.Series((ic := np.unique(s, return_counts=True))[1], index = ic[0]),
                   lambda s: pd.Series(s.index, index=s).groupby(level=0).size()
                  ],
        labels = ['value_counts', 'Counter', 'np_unique', 'groupby_size'],
        n_range = [2 ** k for k in range(5, 25)],
        equality_check = lambda *x: (d:= pd.concat(x, axis=1)).eq(d[0], axis=0).all().all(),
        xlabel = '~len(s)',
        title = f'dtype {datatype}'
    )
    
plot_perfplot('obj')
plot_perfplot('int')

언급URL : https://stackoverflow.com/questions/20076195/what-is-the-most-efficient-way-of-counting-occurrences-in-pandas

반응형