데이터 프레임 열에서 값이 발생하는 빈도를 계산


312

데이터 세트가 있습니다

|category|
cat a
cat b
cat a

(고유 한 값과 빈도를 보여주는)와 같은 것을 반환하고 싶습니다.

category | freq |
cat a       2
cat b       1


94
찾고 df["category"].value_counts()있습니까?
DSM

"df ["category "]. value_counts ()"를 사용할 때 int? 그러나 열 이름을 인덱스로 반환합니까? 데이터 프레임 객체입니까 아니면 시리즈 (수)와 원래의 고유 열 값을 어떻게 결합합니까?
yoshiserry

@yoshiserry 그것은 판다 시리즈 type(df['category'].value_counts())이고 그렇게 말할 것이다
EdChum

나는 그 일에 놀랐지 만 그것에 대해 더 많이 생각하는 것이 합리적입니다. 이 작업을 수행 한 후 일부 열에 값이 포함되며 제외하려는 행이 있습니다. 열을 제거하는 방법을 알고 있지만 행을 어떻게 제외합니까?
yoshiserry

답변:


413

사용 groupbycount:

In [37]:
df = pd.DataFrame({'a':list('abssbab')})
df.groupby('a').count()

Out[37]:

   a
a   
a  2
b  3
s  2

[3 rows x 1 columns]

온라인 문서를 참조하십시오 : http://pandas.pydata.org/pandas-docs/stable/groupby.html

또한 value_counts()@DSM이 언급했듯이 여기에 고양이를 껍질을 벗기는 여러 가지 방법이 있습니다.

In [38]:
df['a'].value_counts()

Out[38]:

b    3
a    2
s    2
dtype: int64

원래 데이터 프레임에 빈도를 다시 추가 transform하려면 정렬 된 인덱스를 반환하십시오.

In [41]:
df['freq'] = df.groupby('a')['a'].transform('count')
df

Out[41]:

   a freq
0  a    2
1  b    3
2  s    2
3  s    2
4  b    3
5  a    2
6  b    3

[7 rows x 2 columns]

@yoshiserry 아니요, 당신이 볼 수있는 것은 변환을 사용할 수있는 데이터 프레임에 주파수 카운트를 다시 추가하려는 경우 고유 값과 빈도를 표시하는 다른 방법과 달리 원본 데이터 프레임과 정렬되는 시리즈를 만드는 것입니다 이. 그것은 또 다른 기술 일뿐입니다. 다시 할당 한 후에 데이터 프레임이 축소되지 않았으며 누락 된 값이 없습니다. 또한 Dataframe에는 항상 색인이 있다고 생각합니다.이를 제거하거나 재설정하거나 새 항목을 할당하거나 열을 색인으로 사용할 수 있다고 생각하지 않습니다
EdChum

4
첫 번째 코드 예제에서 df는 예상대로 할당되지만 df.groupby ( 'a'). count () 행은 빈 데이터 프레임을 반환합니다. 이 답변이 팬더 0.18.1에서 오래된 것일 수 있습니까? 또한 열 이름 'a'가 'a'를 검색하는 값과 동일하다는 것은 약간 혼란 스럽습니다. 직접 편집하지만 코드가 작동하지 않으므로 편집 내용을 확신 할 수 없습니다.
Alex

1
@Alex 당신이 맞습니다. 최신 버전에서는 더 이상 작동하지 않습니다. 왜 그런지 모르겠습니다. 버그가있는 것 같습니다
EdChum

1
df.['a'].value_counts().reset_index()대신에 사용 하지 df.groupby('a')['a'].transform('count')않겠습니까?
탠덤

1
@ tandem, 그들은 다른 일을하고, 호출 value_counts하면 빈도수를 생성합니다. 원래의 df에 대해 새로운 열로 결과를 다시 추가하려면 transform내 대답에 설명 된대로 사용해야 합니다.
EdChum

93

모든 열에 적용하려면 다음을 사용할 수 있습니다.

df.apply(pd.value_counts)

그러면 열 기반 집계 함수 (이 경우 value_counts)가 각 열에 적용됩니다.


10
가장 간단한 답변입니다. 맨 위에 있어야합니다.
Jeffrey Jose

4
이 대답은 간단하지만 ( apply열심히 믿는) 작업은 열이 제공하는 Numpy 배열을 벡터화하는 이점을 활용하지 않습니다. 결과적으로 더 큰 데이터 세트에서 성능이 문제가 될 수 있습니다.
kuanb

58
df.category.value_counts()

이 짧은 코드는 원하는 출력을 제공합니다.

열 이름에 공백이 있으면 사용할 수 있습니다

df['category'].value_counts()

2
또는 사용 [] 열 이름이 공간이 있는지. df['category 1'].value_counts()
Jacob Kalakal Joseph

19
df.apply(pd.value_counts).fillna(0)

value_counts- 고유 한 값의 개수를 포함하는 객체를 반환합니다.

적용 -모든 열의 빈도를 세십시오. 을 설정 axis=1하면 모든 행에 빈도가 표시됩니다

fillna (0)-출력을 더 멋지게 만듭니다. NaN을 0으로 변경


1
이것은 같은 행에 대해 열에서 값의 발생을 계산할 때 매우 강력합니다!
amc

14

0.18.1에서 groupby함께 count고유 한 값의 주파수를 제공하지 않습니다 :

>>> df
   a
0  a
1  b
2  s
3  s
4  b
5  a
6  b

>>> df.groupby('a').count()
Empty DataFrame
Columns: []
Index: [a, b, s]

그러나 고유 값과 주파수는 다음을 사용하여 쉽게 결정됩니다 size.

>>> df.groupby('a').size()
a
a    2
b    3
s    2

df.a.value_counts()정렬 된 값을 사용하면 (내림차순, 즉 가장 큰 값이 먼저) 기본적으로 반환됩니다.



5

DataFrame에 동일한 유형의 값이 있으면 numpy.unique ()return_counts=True 에서 설정할 수도 있습니다 .

index, counts = np.unique(df.values,return_counts=True)

값이 정수이면 np.bincount () 가 더 빠를 수 있습니다.


4

라이브러리가 없으면 대신 다음을 수행 할 수 있습니다.

def to_frequency_table(data):
    frequencytable = {}
    for key in data:
        if key in frequencytable:
            frequencytable[key] += 1
        else:
            frequencytable[key] = 1
    return frequencytable

예:

to_frequency_table([1,1,1,1,2,3,4,4])
>>> {1: 4, 2: 1, 3: 1, 4: 2}

1

예를 dtype="category"들어 열을 카테고리로 먼저 브로드 캐스트하여 팬더로이를 수행 할 수도 있습니다. 예 :

cats = ['client', 'hotel', 'currency', 'ota', 'user_country']

df[cats] = df[cats].astype('category')

그리고 전화 describe:

df[cats].describe()

이것은 당신에게 멋진 가치 카운트 테이블과 조금 더 :) :

    client  hotel   currency    ota user_country
count   852845  852845  852845  852845  852845
unique  2554    17477   132 14  219
top 2198    13202   USD Hades   US
freq    102562  8847    516500  242734  340992

0
n_values = data.income.value_counts()

최초의 고유 한 값 수

n_at_most_50k = n_values[0]

두 번째 고유 한 값 수

n_greater_50k = n_values[1]

n_values

산출:

<=50K    34014
>50K     11208

Name: income, dtype: int64

산출:

n_greater_50k,n_at_most_50k:-
(11208, 34014)

0

@metatoaster는 이미 이것을 지적했습니다. 로 이동하십시오 Counter. 빨리 타 오르고 있습니다.

import pandas as pd
from collections import Counter
import timeit
import numpy as np

df = pd.DataFrame(np.random.randint(1, 10000, (100, 2)), columns=["NumA", "NumB"])

타이머

%timeit -n 10000 df['NumA'].value_counts()
# 10000 loops, best of 3: 715 µs per loop

%timeit -n 10000 df['NumA'].value_counts().to_dict()
# 10000 loops, best of 3: 796 µs per loop

%timeit -n 10000 Counter(df['NumA'])
# 10000 loops, best of 3: 74 µs per loop

%timeit -n 10000 df.groupby(['NumA']).count()
# 10000 loops, best of 3: 1.29 ms per loop

건배!



0
your data:

|category|
cat a
cat b
cat a

해결책:

 df['freq'] = df.groupby('category')['category'].transform('count')
 df =  df.drop_duplicates()

0

나는 이것이 모든 DataFrame 열 목록에 제대로 작동한다고 생각합니다.

def column_list(x):
    column_list_df = []
    for col_name in x.columns:
        y = col_name, len(x[col_name].unique())
        column_list_df.append(y)
return pd.DataFrame(column_list_df)

column_list_df.rename(columns={0: "Feature", 1: "Value_count"})

"column_list"함수는 열 이름을 확인한 다음 각 열 값의 고유성을 확인합니다.


답변을 개선하기 위해 코드 작동 방식에 대한 간단한 설명을 추가 할 수 있습니다.
DobromirM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.