đếm tần số mà một giá trị xảy ra trong cột khung dữ liệu


313

Tôi có một bộ dữ liệu

|category|
cat a
cat b
cat a

Tôi muốn có thể trả về một cái gì đó như (hiển thị các giá trị và tần suất duy nhất)

category | freq |
cat a       2
cat b       1


94
Bạn đang tìm kiếm df["category"].value_counts()?
DSM

Khi sử dụng "df [" category "]. Value_counts ()", nó nói là int? nhưng nó trả về tên cột là chỉ mục? Đây có phải là một đối tượng dataframe hay bằng cách nào đó kết hợp một chuỗi (số đếm) và các giá trị cột duy nhất ban đầu?
yoshiserry

@yoshiserry đó là một loạt Pandas làm type(df['category'].value_counts())và nó sẽ nói như vậy
EdChum

Tôi đã làm, và tôi đã ngạc nhiên về điều đó nhưng nó có ý nghĩa hơn khi tôi nghĩ về nó. Sau khi làm điều này, giá trị được tính vào một số thuộc địa, có những hàng tôi muốn loại trừ. Tôi biết cách xóa cột nhưng làm cách nào để loại trừ hàng?
yoshiserry

Câu trả lời:


414

Sử dụng 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]

Xem các tài liệu trực tuyến: http://pandas.pydata.org/pandas-docs/ sóng / groupby.html

Cũng value_counts()như @DSM đã bình luận, nhiều cách để nuôi mèo ở đây

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

Out[38]:

b    3
a    2
s    2
dtype: int64

Nếu bạn muốn thêm tần số trở lại vào khung dữ liệu ban đầu, hãy sử dụng transformđể trả về một chỉ mục được căn chỉnh:

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 Không, những gì bạn thấy là nó tạo ra một chuỗi khớp với khung dữ liệu gốc, không giống như các phương thức khác hiển thị các giá trị duy nhất và tần số của chúng, nếu bạn muốn thêm tần số đếm ngược vào khung dữ liệu bạn có thể sử dụng biến đổi cho điều này. Đó chỉ là một kỹ thuật khác, bạn lưu ý rằng nó đã không thu gọn khung dữ liệu sau khi gán lại và không có giá trị bị thiếu. Ngoài ra tôi nghĩ rằng Dataframes luôn có một chỉ mục Tôi không nghĩ bạn có thể thoát khỏi nó, chỉ đặt lại nó, gán một cái mới hoặc sử dụng một cột làm chỉ mục
EdChum 13/03/2016

4
Trong ví dụ mã đầu tiên của bạn, df được gán như mong đợi, nhưng dòng này: df.groupby ('a'). Count () trả về một khung dữ liệu trống. Có thể câu trả lời này đã hết hạn với gấu trúc 0.18.1? Ngoài ra, có một chút khó hiểu rằng tên cột 'a' của bạn giống với giá trị bạn đang tìm kiếm 'a'. Tôi sẽ tự chỉnh sửa nhưng vì mã không hoạt động đối với tôi nên tôi không thể chắc chắn về các chỉnh sửa của mình.
Alex

1
@Alex bạn chính xác, có vẻ như trong các phiên bản mới nhất, điều này không còn hoạt động nữa, có vẻ như là một lỗi đối với tôi vì tôi không hiểu tại sao không
EdChum

1
Tại sao không sử dụng df.['a'].value_counts().reset_index()thay thế df.groupby('a')['a'].transform('count')?
song song

1
@tandem, họ làm những việc khác nhau, gọi value_countssẽ tạo ra số đếm tần số, nếu bạn muốn thêm kết quả trở lại dưới dạng cột mới so với df ban đầu của bạn thì bạn phải sử dụng transformnhư chi tiết trong câu trả lời của tôi.
EdChum

93

Nếu bạn muốn áp dụng cho tất cả các cột, bạn có thể sử dụng:

df.apply(pd.value_counts)

Điều này sẽ áp dụng hàm tổng hợp dựa trên cột (trong trường hợp này là value_counts) cho mỗi cột.


10
Đây là câu trả lời đơn giản nhất. Điều này nên ở trên cùng.
Jeffrey Jose

4
Câu trả lời này chỉ đơn giản nhưng (tôi tin) applyhoạt động không tận dụng những lợi thế mà mảng Numpy được vector hóa như các cột cung cấp. Do đó, hiệu suất có thể là một vấn đề trên các bộ dữ liệu lớn hơn.
kuanb

58
df.category.value_counts()

Dòng mã ngắn này sẽ cung cấp cho bạn đầu ra mà bạn muốn.

Nếu tên cột của bạn có khoảng trắng, bạn có thể sử dụng

df['category'].value_counts()

2
Hoặc sử dụng [] nếu tên cột có khoảng trắng. df['category 1'].value_counts()
Jacob Kalakal Joseph

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

value_counts - Trả về đối tượng chứa số lượng giá trị duy nhất

áp dụng - tần số đếm trong mỗi cột. Nếu bạn đặt axis=1, bạn nhận được tần suất ở mỗi hàng

fillna (0) - làm cho đầu ra lạ mắt hơn. Đã thay đổi NaN thành 0


1
Điều này rất mạnh khi đếm số lần xuất hiện của một giá trị trên các cột cho cùng một hàng !!
amc

14

Trong 0.18.1 groupbycùng với countkhông đưa ra tần số của các giá trị duy nhất:

>>> 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]

Tuy nhiên, các giá trị duy nhất và tần số của chúng được xác định dễ dàng bằng cách sử dụng size:

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

Với df.a.value_counts()các giá trị được sắp xếp (theo thứ tự giảm dần, tức là giá trị lớn nhất trước tiên) được trả về theo mặc định.



5

Nếu DataFrame của bạn có các giá trị với cùng loại, bạn cũng có thể đặt return_counts=Truetrong numpy.unique () .

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

np.bincount () có thể nhanh hơn nếu giá trị của bạn là số nguyên.


4

Nếu không có bất kỳ thư viện nào, bạn có thể làm điều này thay vào đó:

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

Thí dụ:

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

1

Bạn cũng có thể làm điều này với gấu trúc bằng cách phát các cột của bạn dưới dạng danh mục trước, ví dtype="category"dụ:

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

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

và sau đó gọi describe:

df[cats].describe()

Điều này sẽ cung cấp cho bạn một bảng tổng số giá trị đẹp và nhiều hơn một chút :):

    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()

Số giá trị duy nhất đầu tiên

n_at_most_50k = n_values[0]

Số giá trị duy nhất thứ hai

n_greater_50k = n_values[1]

n_values

Đầu ra:

<=50K    34014
>50K     11208

Name: income, dtype: int64

Đầu ra:

n_greater_50k,n_at_most_50k:-
(11208, 34014)

0

@metatoaster đã chỉ ra điều này. Đi cho Counter. Nó đang cháy rất nhanh.

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"])

Đồng hồ bấm giờ

%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

Chúc mừng!



0
your data:

|category|
cat a
cat b
cat a

giải pháp:

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

0

Tôi tin rằng điều này sẽ hoạt động tốt cho bất kỳ danh sách cột DataFrame nào.

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"})

Hàm "cột_list" kiểm tra tên cột và sau đó kiểm tra tính duy nhất của từng giá trị cột.


Bạn có thể thêm một lời giải thích ngắn gọn về cách mã của bạn hoạt động để cải thiện câu trả lời của bạn.
DobromirM
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.