programing

판다 '카운트(distinct)' 상당)'

goodjava 2022. 10. 21. 21:22

판다 '카운트(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 YEARMONTH
    
    팬더에서는 다음과 같다(세트).as_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