반응형
판다집계 수는 구별
사용자 활동 기록이 있고 하루 전체 기간과 고유 사용자 수에 대한 보고서를 생성하려고 합니다.
import numpy as np
import pandas as pd
df = pd.DataFrame({'date': ['2013-04-01','2013-04-01','2013-04-01','2013-04-02', '2013-04-02'],
'user_id': ['0001', '0001', '0002', '0002', '0002'],
'duration': [30, 15, 20, 15, 30]})
집계 기간은 매우 간단합니다.
group = df.groupby('date')
agg = group.aggregate({'duration': np.sum})
agg
duration
date
2013-04-01 65
2013-04-02 45
제가 하고 싶은 것은 지속 시간과 고유 횟수를 동시에 합하는 것이지만 count_distinct에 해당하는 것을 찾을 수 없는 것 같습니다.
agg = group.aggregate({ 'duration': np.sum, 'user_id': count_distinct})
이 방법은 효과가 있지만, 분명 더 좋은 방법이 있을 겁니다, 아닌가요?
group = df.groupby('date')
agg = group.aggregate({'duration': np.sum})
agg['uv'] = df.groupby('date').user_id.nunique()
agg
duration uv
date
2013-04-01 65 2
2013-04-02 45 1
Series 객체의 고유한 항목 수를 Aggregate 함수로 되돌리는 함수만 제공하면 될 것 같은데, 제 마음대로 다양한 라이브러리를 접하지는 못합니다.또한, 객체별 그룹은 이미 이 정보를 알고 있는 것 같은데, 제가 노력을 중복해서 하는 것은 아닐까요?
다음 중 하나는 어떻습니까?
>>> df
date duration user_id
0 2013-04-01 30 0001
1 2013-04-01 15 0001
2 2013-04-01 20 0002
3 2013-04-02 15 0002
4 2013-04-02 30 0002
>>> df.groupby("date").agg({"duration": np.sum, "user_id": pd.Series.nunique})
duration user_id
date
2013-04-01 65 2
2013-04-02 45 1
>>> df.groupby("date").agg({"duration": np.sum, "user_id": lambda x: x.nunique()})
duration user_id
date
2013-04-01 65 2
2013-04-02 45 1
'nunique'는 팬더 0.20.0 이후 .agg ()의 옵션이므로 다음과 같습니다.
df.groupby('date').agg({'duration': 'sum', 'user_id': 'nunique'})
이미 제시된 답변에 문자열을 이용한 솔루션을 추가하는 것입니다."nunique"
훨씬 더 빨라진 것 같습니다. 여기서 ~21M 행 데이터 프레임을 테스트한 다음 ~2M으로 그룹화합니다.
%time _=g.agg({"id": lambda x: x.nunique()})
CPU times: user 3min 3s, sys: 2.94 s, total: 3min 6s
Wall time: 3min 20s
%time _=g.agg({"id": pd.Series.nunique})
CPU times: user 3min 2s, sys: 2.44 s, total: 3min 4s
Wall time: 3min 18s
%time _=g.agg({"id": "nunique"})
CPU times: user 14 s, sys: 4.76 s, total: 18.8 s
Wall time: 24.4 s
그룹당 몇 개의 고유한 값만 얻으려면 방법을 사용할 수 있습니다.nunique
직접적으로DataFrameGroupBy
개체:
df.groupby('date')['user_id'].nunique()
를 사용하면 모든 열에 대해 한 번에 찾을 수 있습니다.aggregate
방법,
df.aggregate(func=pd.Series.nunique, axis=0)
# or
df.aggregate(func='nunique', axis=0)
언급URL : https://stackoverflow.com/questions/18554920/pandas-aggregate-count-distinct
반응형
'code' 카테고리의 다른 글
php로 mysql 데이터베이스에서 그래프 및 차트를 생성하는 방법 (0) | 2023.10.15 |
---|---|
MVC에서 항목 목록을 게시하려면 어떻게 해야 합니까? (0) | 2023.10.10 |
wordpress tax_분류학이 공백인 query (0) | 2023.10.10 |
AngularJS - HTML의 호출 함수 (0) | 2023.10.10 |
MySQL 데몬 잠금 문제 (0) | 2023.10.10 |