판다의 발생을 세는 가장 효율적인 방법은 무엇일까요?
큰 데이터 프레임(약 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_Words
Data 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
+size
에pandas
.
사용방법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
'programing' 카테고리의 다른 글
MySQLworkbench 연결 인코딩을 UTF8로 설정하는 방법 (0) | 2023.01.24 |
---|---|
암호화로 보호된 토큰 생성 (0) | 2023.01.24 |
Wordpress에서의 커스텀쿼리 실행에 문제가 있는 경우 (0) | 2023.01.24 |
클래스의 최종 정적 필드 값은 어떻게 참조할 수 있습니까? (0) | 2023.01.24 |
str_replace를 사용하여 첫 번째 일치 시에만 작동합니까? (0) | 2023.01.24 |