데이터 세트가 있습니다
|category|
cat a
cat b
cat a
(고유 한 값과 빈도를 보여주는)와 같은 것을 반환하고 싶습니다.
category | freq |
cat a 2
cat b 1
df["category"].value_counts()
있습니까?
type(df['category'].value_counts())
이고 그렇게 말할 것이다
데이터 세트가 있습니다
|category|
cat a
cat b
cat a
(고유 한 값과 빈도를 보여주는)와 같은 것을 반환하고 싶습니다.
category | freq |
cat a 2
cat b 1
df["category"].value_counts()
있습니까?
type(df['category'].value_counts())
이고 그렇게 말할 것이다
답변:
사용 groupby
및 count
:
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]
df.['a'].value_counts().reset_index()
대신에 사용 하지 df.groupby('a')['a'].transform('count')
않겠습니까?
value_counts
하면 빈도수를 생성합니다. 원래의 df에 대해 새로운 열로 결과를 다시 추가하려면 transform
내 대답에 설명 된대로 사용해야 합니다.
모든 열에 적용하려면 다음을 사용할 수 있습니다.
df.apply(pd.value_counts)
그러면 열 기반 집계 함수 (이 경우 value_counts)가 각 열에 적용됩니다.
apply
열심히 믿는) 작업은 열이 제공하는 Numpy 배열을 벡터화하는 이점을 활용하지 않습니다. 결과적으로 더 큰 데이터 세트에서 성능이 문제가 될 수 있습니다.
df.category.value_counts()
이 짧은 코드는 원하는 출력을 제공합니다.
열 이름에 공백이 있으면 사용할 수 있습니다
df['category'].value_counts()
df['category 1'].value_counts()
df.apply(pd.value_counts).fillna(0)
value_counts- 고유 한 값의 개수를 포함하는 객체를 반환합니다.
적용 -모든 열의 빈도를 세십시오. 을 설정 axis=1
하면 모든 행에 빈도가 표시됩니다
fillna (0)-출력을 더 멋지게 만듭니다. NaN을 0으로 변경
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()
정렬 된 값을 사용하면 (내림차순, 즉 가장 큰 값이 먼저) 기본적으로 반환됩니다.
df의 여러 열에 대해 목록 이해 및 value_counts 사용
[my_series[c].value_counts() for c in list(my_series.select_dtypes(include=['O']).columns)]
DataFrame에 동일한 유형의 값이 있으면 numpy.unique ()return_counts=True
에서 설정할 수도 있습니다 .
index, counts = np.unique(df.values,return_counts=True)
값이 정수이면 np.bincount () 가 더 빠를 수 있습니다.
예를 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
@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
건배!
나는 이것이 모든 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"함수는 열 이름을 확인한 다음 각 열 값의 고유성을 확인합니다.
collections.Counter