Programing

팬더 수 (고유 한)

lottogame 2020. 4. 15. 10:26
반응형

팬더 수 (고유 한)


여러 데이터베이스 (oracle, mssql 등)가 있으므로 팬더를 db 대체물로 사용하고 있으며 SQL과 동등한 일련의 명령을 만들 수 없습니다.

몇 가지 열이있는 DataFrame에 테이블이로드되었습니다.

YEARMONTH, CLIENTCODE, SIZE, .... etc etc

SQL에서 매년 다른 클라이언트의 수를 계산하는 것은 다음과 같습니다.

SELECT count(distinct CLIENTCODE) FROM table GROUP BY YEARMONTH;

결과는

201301    5000
201302    13245

팬더에서 어떻게 할 수 있습니까?


나는 이것이 당신이 원하는 것이라고 믿습니다.

table.groupby('YEARMONTH').CLIENTCODE.nunique()

예:

In [2]: table
Out[2]: 
   CLIENTCODE  YEARMONTH
0           1     201301
1           1     201301
2           2     201301
3           1     201302
4           2     201302
5           2     201302
6           3     201302

In [3]: table.groupby('YEARMONTH').CLIENTCODE.nunique()
Out[3]: 
YEARMONTH
201301       2
201302       3

여기에 매우 간단한 또 ​​다른 방법이 있습니다. 데이터 프레임 이름이 daat있고 열 이름이YEARMONTH

daat.YEARMONTH.value_counts()

흥미롭게도, 종종 len(unique())보다 몇 배 (3x-15x) 빠릅니다 nunique().


를 사용하면 crosstab보다 많은 정보를 반환합니다groupby nunique

pd.crosstab(df.YEARMONTH,df.CLIENTCODE)
Out[196]: 
CLIENTCODE  1  2  3
YEARMONTH          
201301      2  1  0
201302      1  2  1

약간 수정 한 후 결과를 얻습니다.

pd.crosstab(df.YEARMONTH,df.CLIENTCODE).ne(0).sum(1)
Out[197]: 
YEARMONTH
201301    2
201302    3
dtype: int64

나는 또한 사용하고 nunique있지만 'min', 'max', 'count' or 'mean'의 집계 함수를 사용해야하는 경우 매우 유용합니다 .

df.groupby('YEARMONTH')['CLIENTCODE'].transform('nunique') #count(distinct)
df.groupby('YEARMONTH')['CLIENTCODE'].transform('min')     #min
df.groupby('YEARMONTH')['CLIENTCODE'].transform('max')     #max
df.groupby('YEARMONTH')['CLIENTCODE'].transform('mean')    #average
df.groupby('YEARMONTH')['CLIENTCODE'].transform('count')   #count

새로운 팬더 버전을 사용하면 데이터 프레임으로 쉽게 얻을 수 있습니다.

unique_count = pd.groupby(['YEARMONTH'], as_index=False).agg(uniq_CLIENTCODE =('CLIENTCODE',pd.Series.count))

참고 URL : https://stackoverflow.com/questions/15411158/pandas-countdistinct-equivalent

반응형