판다 '카운트(distinct)' 상당)'
데이터베이스(Oracle, SQL Server 등)가 여러 개 있기 때문에 데이터베이스 대체로 Panda를 사용하고 있으며 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())보다 몇 배(3배~15배) 빠르다.nunique().
저도 사용하고 있습니다.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
다른 열의 집계와 함께 열의 구별
모든 열에 대해 고유한 개수의 값을 얻는 방법(CLIENTCODE고객님의 경우)를 사용하여nunique. 입력은 사전으로 전달할 수 있습니다.agg함수와 다른 열의 집계를 함께 수행합니다.
grp_df = df.groupby('YEARMONTH').agg({'CLIENTCODE': ['nunique'],
'other_col_1': ['sum', 'count']})
# to flatten the multi-level columns
grp_df.columns = ["_".join(col).strip() for col in grp_df.columns.values]
# if you wish to reset the index
grp_df.reset_index(inplace=True)
사용.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
여기에서는 여러 열에 걸쳐 카운트를 구별하는 방법을 보여 줍니다.몇 가지 데이터를 살펴보겠습니다.
data = {'CLIENT_CODE':[1,1,2,1,2,2,3],
'YEAR_MONTH':[201301,201301,201301,201302,201302,201302,201302],
'PRODUCT_CODE': [100,150,220,400,50,80,100]
}
table = pd.DataFrame(data)
table
CLIENT_CODE YEAR_MONTH PRODUCT_CODE
0 1 201301 100
1 1 201301 150
2 2 201301 220
3 1 201302 400
4 2 201302 50
5 2 201302 80
6 3 201302 100
다음으로 관심 열을 나열하고 약간 변경된 구문으로 groupby를 사용합니다.
columns = ['YEAR_MONTH', 'PRODUCT_CODE']
table[columns].groupby(table['CLIENT_CODE']).nunique()
델은 다음을 취득합니다.
YEAR_MONTH PRODUCT_CODE CLIENT_CODE
1 2 3
2 2 3
3 1 1
새로운 Panda 버전에서는 데이터 프레임으로 쉽게 얻을 수 있습니다.
unique_count = pd.groupby(['YEARMONTH'], as_index=False).agg(uniq_CLIENTCODE=('CLIENTCODE', pd.Series.count))
이제 다음 웹 사이트도 사용할 수 있습니다.dplyrPython의 구문:
>>> from datar.all import f, tibble, group_by, summarise, n_distinct
>>>
>>> data = tibble(
... CLIENT_CODE=[1,1,2,1,2,2,3],
... YEAR_MONTH=[201301,201301,201301,201302,201302,201302,201302]
... )
>>>
>>> data >> group_by(f.YEAR_MONTH) >> summarise(n=n_distinct(f.CLIENT_CODE))
YEAR_MONTH n
<int64> <int64>
0 201301 2
1 201302 3
피벗 테이블을 만들고 nunique series 함수를 사용합니다.
ID = [ 123, 123, 123, 456, 456, 456, 456, 789, 789]
domain = ['vk.com', 'vk.com', 'twitter.com', 'vk.com', 'facebook.com',
'vk.com', 'google.com', 'twitter.com', 'vk.com']
df = pd.DataFrame({'id':ID, 'domain':domain})
fp = pd.pivot_table(data=df, index='domain', aggfunc=pd.Series.nunique)
print(fp)
출력:
id
domain
facebook.com 1
google.com 1
twitter.com 2
vk.com 3
- 연간 서로 다른 클라이언트 수 및 크기(즉, 여러 열의 고유한 값 수)를 얻으려면 열 목록을 사용합니다.
df.groupby('YEARMONTH')[['CLIENTCODE', 'SIZE']].nunique() - 실제로 위의 코드에서 얻은 결과는 SQL 구문을 사용하여 얻을 수 있습니다.
df사용.pandasql(SQL 구문을 사용하여 판다 DataFrames를 쿼리할 수 있는 Panda 기반 모듈입니다.)#! pip install pandasql from pandasql import sqldf sqldf(""" SELECT COUNT(DISTINCT CLIENTCODE), COUNT(DISTINCT SIZE) FROM df GROUP BY YEARMONTH """) - YEAR MONTH를 열(다음 SQL 쿼리의 아날로그)로 유지하려면
팬더에서는 다음과 같다(세트).SELECT YEARMONTH, COUNT(DISTINCT CLIENTCODE), COUNT(DISTINCT SIZE) FROM df GROUP BY YEARMONTHas_index로.False):df.groupby('YEARMONTH', as_index=False)[['CLIENTCODE', 'SIZE']].nunique() - 집계된 열(예: 다음 SQL 쿼리의 아날로그)에 사용자 지정 이름을 설정해야 하는 경우:
판다에게 명명된 집계를 사용한다.SELECT YEARMONTH, COUNT(DISTINCT CLIENTCODE) AS `No. clients`, COUNT(DISTINCT SIZE) AS `No. size` FROM df GROUP BY YEARMONTH( df.groupby('YEARMONTH', as_index=False) .agg(**{'No. clients':('CLIENTCODE', 'nunique'), 'No. size':('SIZE', 'nunique')}) )
언급URL : https://stackoverflow.com/questions/15411158/pandas-countdistinct-equivalent
'programing' 카테고리의 다른 글
| Laravel Storage 폴더에 대한 경로는 어떻게 얻습니까? (0) | 2022.10.21 |
|---|---|
| Google Maps VueJS 컴포넌트(vue2-google-maps)를 Larabel 블레이드 뷰에 통합 (0) | 2022.10.21 |
| jQuery를 사용하여 HTML 문자열 이스케이프 (0) | 2022.10.21 |
| Java 컴파일 클래스에는 달러 기호가 포함되어 있습니다. (0) | 2022.10.21 |
| 에 이 쿼리에 ERROR 에 이 쿼리에 ERROR 에 이 쿼리에 ERROR <TAB>용 테이블 스토리지 엔진LE > 에는 이 옵션이 없습니다.이것은 의 MySQL에 의해 반환된 에러입니다.이것은 의 MySQL에 의해 반환된 에러.. (0) | 2022.10.21 |