팬더 수 (고유 한)


289

여러 데이터베이스 (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']. unique ()를 수행했으며 YEARMONTH에 의해 인덱스 된 두 개의 시리즈와 모든 고유 값이 제공됩니다. 각 계열의 값을 계산하는 방법은 무엇입니까?
Adriano Almeida

일부의 경우, value_counts당신이 찾고있는 답이 될 수도 있습니다 : pandas.pydata.org/pandas-docs/stable/generated/…
sachinruk

답변:


434

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

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

2
.drop_duplicates (subset = [ 'col1', 'col2'])처럼 같이 고유하게 여러 개의 열이있는 경우 어떻게합니까?
ErnestScribbler

4
이 고유 카운트에 액세스하는 방법. 열 이름이 없기 때문에
Tarun Khaneja

고마워요. 리 샘플 출력에이 스타일을 사용했습니다 df_watch_record.resample ( 'M'). user.nunique ()는 한 달에 영화를 본 순 사용자 수를 계산합니다.
Mehdi Kazemi

1
table.groupby ( 'YEARMONTH'). CLIENTCODE.nunique (). sort_values ​​(ascending = False)
wllbll

후에 그룹 식별자를 검색 할 수 nunique있습니까? 이 답변의 결과가 있기 때문에 내가, 방법을 찾을 수 있습니다으로 시도 Series하는 없습니다 DataFrame.
조쉬 한센

93

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

daat.YEARMONTH.value_counts()

1
나는이 답변을 좋아한다. 열 이름에 '.'이있는 경우이 방법을 어떻게 사용할 수 있습니까? 그 안에 (예 : 'ck.Class')? 감사합니다

5
daat [ 'ck.Class']. value_counts ()
StatguyUser

28
이것은 질문 된 내용을 다루지 않습니다.
Aaron Schumacher

6
이것은 각 그룹이 갖는 특정 열의 고유 한 값이 아니라 각 그룹 내의 관측치 수를 계산합니다.
Jason Goal

2
이것은 정답이 아닙니다. DISTINCT질문 의 요구 사항을 반영하지 않습니다 ! 또한 카운트는 포함되지 않습니다 NaN!
Corey Levinson

47

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


11
당신은 이것을 의미합니까? .CLIENTCODE.apply(lambda x: len(x.unique())), 여기에서
user4015990

6
@ user32185 apply람다가 있는 통화 에 드롭해야합니다 . 예를 들어 df.groupby('YEARMONTH')['CLIENTCODE'].apply(lambda x: x.unique().shape[0]).
3novak

3
구문, 내가 사용하지 완전히 명확하지 않다 len(df['column'].unique())람다 함수에 대한 필요
mlh351

내가 가지고 TypeError: object of type 'method' has no len()에서 Chen's, 코멘트 3novak's날 위해 일했습니다.
Jason Goal

4

를 사용하면 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

어떻게 두 개의 컬럼으로이를 내보낼 수 있습니다 YEARMONTHcount. 또한 내림차순으로 카운트를 설정할 수 있습니까?
Murtaza Haji

3

나는 또한 사용하고 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

0

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

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

0

여기서는 여러 열에 대해 카운트를 구별하는 접근 방식입니다. 몇 가지 데이터를 보자.

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

0

다른 열의 집계와 함께 고유 한 열

모든 열 ( 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.