Python/Python Pandas

Python Pandas : nunique() (count distinct, 중복없는 값 세기, unique한 값의 개수 세기, pandas count distinct, DataFrame count distinct)

CosmosProject 2023. 10. 24. 23:23
728x90
반응형

 

 

 

nunique() method는 DataFrame이나 Series에 있는 값들 중 중복값을 제거한 unique한 값의 개수를 return합니다.

 

 

바로 예시를 봅시다.

 

import pandas as pd

df_test = pd.DataFrame(
    {
        'col1': [1, 1, 3, 3, 4, 4, 4],
        'col2': [8, 8, 8, 8, 8, 9, 9],
    }
)
print(df_test)

nunique_result = df_test.nunique()
print(nunique_result)
print(type(nunique_result))



-- Result
   col1  col2
0     1     8
1     1     8
2     3     8
3     3     8
4     4     8
5     4     9
6     4     9

col1    3
col2    2
dtype: int64

<class 'pandas.core.series.Series'>

 

df_test라는 DataFrame을 만들었고 거기에 nunique를 적용해보았습니다.

 

 

 

 

   col1  col2
0     1     8
1     1     8
2     3     8
3     3     8
4     4     8
5     4     9
6     4     9

col1    3
col2    2

 

결과부터 봐봅시다.

 

일단 nunique()를 DataFrame에 적용시키면 각 column에 존재하는 값들 중 unique한 값이 몇개인지 (= 몇 종류인지)를 return합니다.

 

col1의 값을 보면 1이 2개, 3이 2개, 4가 3개 있습니다.

뭐가 몇개있는지는 상관없이 중복제거를 하면 1, 3, 4 세 종류의 값이 col1에 존재합니다.

따라서 nunique()의 결과로 col1에는 3이 return되었습니다.

 

col2의 unique한 값은 8과 9 두 가지 이므로 col2에 대한 값은 2가 return되었습니다.

 

 

 

 

 

import pandas as pd

sr_test = pd.Series([1, 1, 3, 3, 4, 4, 4])
print(sr_test)

nunique_result = sr_test.nunique()
print(nunique_result)
print(type(nunique_result))



-- Result
0    1
1    1
2    3
3    3
4    4
5    4
6    4
dtype: int64

3

<class 'int'>

 

nunique()는 Series에도 적용할 수 있습니다.

마찬가지로 Series에 존재하는 값들의 unique한 개수를 세어줍니다.

 

sr_test에서 unique한 값은 1, 3, 4이므로 3이 return됩니다.

 

 

 

 

nunique()를 이용하면 마치 쿼리에서 count(distinct ~~)와 같은 기능을 사용할 수 있습니다.

 

import pandas as pd

df_test = pd.DataFrame(
    {
        'date': [
            20230101, 20230101, 20230101, 20230101,
            20230102, 20230102, 20230102,
            20230103, 20230103,
        ],
        'item': [
            1, 1, 2, 2,
            1, 1, 1,
            5, 7,
        ],
    }
)
print(df_test)


df_daily_item_count = df_test.groupby(by=['date']).aggregate(
    {
        'item': pd.Series.nunique
    }
)

print(df_daily_item_count)



-- Result
       date  item
0  20230101     1
1  20230101     1
2  20230101     2
3  20230101     2
4  20230102     1
5  20230102     1
6  20230102     1
7  20230103     5
8  20230103     7

          item
date          
20230101     2
20230102     1
20230103     2

 

각 date에 대해 item의 종류와 개수가 다른데,

각 date에 존재하는 unique한 item의 개수를 위처럼 카운팅할 수 있습니다.

 

 

 

 

 

 

728x90
반응형