programing

판다와 함께 그룹별 고유값 계산

javaba 2023. 1. 29. 20:23
반응형

판다와 함께 그룹별 고유값 계산

일의로 계산해야 합니다.ID모든 것의 가치관domain.

데이터가 있습니다.

ID, domain
123, 'vk.com'
123, 'vk.com'
123, 'twitter.com'
456, 'vk.com'
456, 'facebook.com'
456, 'vk.com'
456, 'google.com'
789, 'twitter.com'
789, 'vk.com'

나는 노력한다df.groupby(['domain', 'ID']).count()

하지만 나는 받고 싶어요

domain, count
vk.com   3
twitter.com   2
facebook.com   1
google.com   1

필요한 것은 다음과 같습니다.

df = df.groupby('domain')['ID'].nunique()

print (df)
domain
'facebook.com'    1
'google.com'      1
'twitter.com'     2
'vk.com'          3
Name: ID, dtype: int64

필요한 경우 '문자:

df = df.ID.groupby([df.domain.str.strip("'")]).nunique()
print (df)
domain
facebook.com    1
google.com      1
twitter.com     2
vk.com          3
Name: ID, dtype: int64

Jon Clements의 코멘트:

df.groupby(df.domain.str.strip("'"))['ID'].nunique()

다음과 같이 열 이름을 유지할 수 있습니다.

df = df.groupby(by='domain', as_index=False).agg({'ID': pd.Series.nunique})
print(df)
    domain  ID
0       fb   1
1      ggl   1
2  twitter   2
3       vk   3

다른 점은 말이다.nunique()시리즈를 반환하고agg()Data Frame을 반환합니다.

일반적으로 단일 열의 고유한 값을 카운트하려면 다음과 같이 사용할 수 있습니다.

df.domain.value_counts()

#'vk.com'          5
#'twitter.com'     2
#'facebook.com'    1
#'google.com'      1
#Name: domain, dtype: int64

컬럼의 고유값 수를 표시하려면 다음 명령을 사용합니다.

df.domain.nunique()
# 4

이러한 모든 고유값을 얻으려면 , 또는 를 사용할 수 있습니다.두 함수의 약간의 차이는 다음과 같습니다.unique을 반환하다numpy.array하는 동안에drop_duplicatesa를 반환하다pandas.Series:

df.domain.unique()
# array(["'vk.com'", "'twitter.com'", "'facebook.com'", "'google.com'"], dtype=object)

df.domain.drop_duplicates()
#0          'vk.com'
#2     'twitter.com'
#4    'facebook.com'
#6      'google.com'
#Name: domain, dtype: object

이 문제에 대해서는 다른 변수에 대해 다른 값을 세고 싶기 때문에,groupby여기서 다른 답변에 의해 제공되는 방법, 먼저 중복을 드롭하고 나서 할 수도 있습니다.value_counts():

import pandas as pd
df.drop_duplicates().domain.value_counts()

# 'vk.com'          3
# 'twitter.com'     2
# 'facebook.com'    1
# 'google.com'      1
# Name: domain, dtype: int64

df.domain.value_value()

>>> df.domain.value_counts()

vk.com          5

twitter.com     2

google.com      1

facebook.com    1

Name: domain, dtype: int64

내가 정확히 이해했다면, 당신은 다른 숫자의IDs for everydomain그럼, 다음의 조작을 실시해 주세요.

output = df.drop_duplicates()
output.groupby('domain').size()

출력:

    domain
facebook.com    1
google.com      1
twitter.com     2
vk.com          3
dtype: int64

또,value_counts효율이 약간 떨어집니다.하지만 제일 좋은 건 제즈라엘의 대답이야nunique:

%timeit df.drop_duplicates().groupby('domain').size()
1000 loops, best of 3: 939 µs per loop
%timeit df.drop_duplicates().domain.value_counts()
1000 loops, best of 3: 1.1 ms per loop
%timeit df.groupby('domain')['ID'].nunique()
1000 loops, best of 3: 440 µs per loop

언급URL : https://stackoverflow.com/questions/38309729/count-unique-values-per-groups-with-pandas

반응형