code

판다집계 수는 구별

starcafe 2023. 10. 10. 20:47
반응형

판다집계 수는 구별

사용자 활동 기록이 있고 하루 전체 기간과 고유 사용자 수에 대한 보고서를 생성하려고 합니다.

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)

aggregate | Pandas Documents

언급URL : https://stackoverflow.com/questions/18554920/pandas-aggregate-count-distinct

반응형