Bảng tần suất cho một biến đơn


97

Một câu hỏi cuối cùng cho gấu trúc mới trong ngày: Làm cách nào để tạo bảng cho một Sê-ri đơn?

Ví dụ:

my_series = pandas.Series([1,2,2,3,3,3])
pandas.magical_frequency_function( my_series )

>> {
     1 : 1,
     2 : 2, 
     3 : 3
   }

Rất nhiều googling đã dẫn tôi đến Series.describe () và pandas.crosstabs, nhưng cả hai đều không làm được những gì tôi cần: một biến, được tính theo danh mục. Ồ, và sẽ thật tuyệt nếu nó hoạt động với các kiểu dữ liệu khác nhau: chuỗi, int, v.v.

Câu trả lời:


153

Có thể .value_counts()?

>>> import pandas
>>> my_series = pandas.Series([1,2,2,3,3,3, "fred", 1.8, 1.8])
>>> my_series
0       1
1       2
2       2
3       3
4       3
5       3
6    fred
7     1.8
8     1.8
>>> counts = my_series.value_counts()
>>> counts
3       3
2       2
1.8     2
fred    1
1       1
>>> len(counts)
5
>>> sum(counts)
9
>>> counts["fred"]
1
>>> dict(counts)
{1.8: 2, 2: 2, 3: 3, 1: 1, 'fred': 1}

5
.value_counts().sort_index(1), để ngăn cột đầu tiên có thể hơi trật tự
smci

9
Có tương đương cho DataFrame, thay vì chuỗi không? Tôi đã thử chạy .value_counts () trên df và nhận đượcAttributeError: 'DataFrame' object has no attribute 'value_counts'
Mittenchops

1
Có cách nào dễ dàng để chuyển đổi các số đếm này thành tỷ lệ không?
dsaxton 31-07-15

7
@dsaxton bạn có thể sử dụng .value_counts (normalize = True) để chuyển đổi kết quả cho tỷ lệ
Max Power

2
Thay vào đó, để sử dụng điều này trên khung dữ liệu, hãy chuyển đổi thành biểu diễn mảng 1-D tương đương, chẳng hạn như - pd.value_counts(df.values.ravel())trả về một chuỗi có indexvaluesthuộc tính chứa các phần tử duy nhất và số lượng của chúng tương ứng.
Nickil Maveli

11

Bạn có thể sử dụng khả năng hiểu danh sách trên khung dữ liệu để đếm tần số của các cột như vậy

[my_series[c].value_counts() for c in list(my_series.select_dtypes(include=['O']).columns)]

Phá vỡ:

my_series.select_dtypes(include=['O']) 

Chỉ chọn dữ liệu phân loại

list(my_series.select_dtypes(include=['O']).columns) 

Chuyển các cột từ phía trên thành một danh sách

[my_series[c].value_counts() for c in list(my_series.select_dtypes(include=['O']).columns)] 

Lặp lại danh sách trên và áp dụng value_counts () cho từng cột


5

Câu trả lời do @DSM cung cấp rất đơn giản và dễ hiểu, nhưng tôi nghĩ rằng tôi sẽ thêm đầu vào của riêng mình cho câu hỏi này. Nếu bạn nhìn vào mã cho pandas.value_counts , bạn sẽ thấy rằng có rất nhiều điều đang diễn ra.

Nếu bạn cần tính tần suất của nhiều chuỗi, điều này có thể mất một lúc. Cách triển khai nhanh hơn sẽ là sử dụng numpy.unique vớireturn_counts = True

Đây là một ví dụ:

import pandas as pd
import numpy as np

my_series = pd.Series([1,2,2,3,3,3])

print(my_series.value_counts())
3    3
2    2
1    1
dtype: int64

Lưu ý ở đây rằng mặt hàng được trả lại là một con gấu trúc.

Khi so sánh, numpy.uniquetrả về một bộ giá trị có hai mục, các giá trị duy nhất và số lượng.

vals, counts = np.unique(my_series, return_counts=True)
print(vals, counts)
[1 2 3] [1 2 3]

Sau đó, bạn có thể kết hợp chúng thành một từ điển:

results = dict(zip(vals, counts))
print(results)
{1: 1, 2: 2, 3: 3}

Và sau đó thành một pandas.Series

print(pd.Series(results))
1    1
2    2
3    3
dtype: int64

0

để phân phối tần suất của một biến có quá nhiều giá trị, bạn có thể thu gọn các giá trị trong các lớp,

Ở đây tôi thừa giá trị cho employratebiến và không có nghĩa là nó phân phối tần số với trực tiếpvalues_count(normalize=True)

                country  employrate alcconsumption
0           Afghanistan   55.700001            .03
1               Albania   11.000000           7.29
2               Algeria   11.000000            .69
3               Andorra         nan          10.17
4                Angola   75.699997           5.57
..                  ...         ...            ...
208             Vietnam   71.000000           3.91
209  West Bank and Gaza   32.000000               
210         Yemen, Rep.   39.000000             .2
211              Zambia   61.000000           3.56
212            Zimbabwe   66.800003           4.96

[213 rows x 3 columns]

phân phối tần số values_count(normalize=True)mà không có phân loại, độ dài kết quả ở đây là 139 (có vẻ như vô nghĩa khi phân bố tần số):

print(gm["employrate"].value_counts(sort=False,normalize=True))

50.500000   0.005618
61.500000   0.016854
46.000000   0.011236
64.500000   0.005618
63.500000   0.005618

58.599998   0.005618
63.799999   0.011236
63.200001   0.005618
65.599998   0.005618
68.300003   0.005618
Name: employrate, Length: 139, dtype: float64

đặt phân loại chúng tôi đặt tất cả các giá trị với một phạm vi nhất định tức là.

0-10 như 1,
11-20 như 2  
21-30 như 3, v.v.
gm["employrate"]=gm["employrate"].str.strip().dropna()  
gm["employrate"]=pd.to_numeric(gm["employrate"])
gm['employrate'] = np.where(
   (gm['employrate'] <=10) & (gm['employrate'] > 0) , 1, gm['employrate']
   )
gm['employrate'] = np.where(
   (gm['employrate'] <=20) & (gm['employrate'] > 10) , 1, gm['employrate']
   )
gm['employrate'] = np.where(
   (gm['employrate'] <=30) & (gm['employrate'] > 20) , 2, gm['employrate']
   )
gm['employrate'] = np.where(
   (gm['employrate'] <=40) & (gm['employrate'] > 30) , 3, gm['employrate']
   )
gm['employrate'] = np.where(
   (gm['employrate'] <=50) & (gm['employrate'] > 40) , 4, gm['employrate']
   )
gm['employrate'] = np.where(
   (gm['employrate'] <=60) & (gm['employrate'] > 50) , 5, gm['employrate']
   )
gm['employrate'] = np.where(
   (gm['employrate'] <=70) & (gm['employrate'] > 60) , 6, gm['employrate']
   )
gm['employrate'] = np.where(
   (gm['employrate'] <=80) & (gm['employrate'] > 70) , 7, gm['employrate']
   )
gm['employrate'] = np.where(
   (gm['employrate'] <=90) & (gm['employrate'] > 80) , 8, gm['employrate']
   )
gm['employrate'] = np.where(
   (gm['employrate'] <=100) & (gm['employrate'] > 90) , 9, gm['employrate']
   )
print(gm["employrate"].value_counts(sort=False,normalize=True))

sau khi phân loại chúng tôi có một phân bố tần số rõ ràng. ở đây chúng ta có thể dễ dàng thấy rằng 37.64%các quốc gia có tỷ lệ việc làm giữa 51-60%11.79%các quốc gia có tỷ lệ việc làm giữa71-80%

5.000000   0.376404
7.000000   0.117978
4.000000   0.179775
6.000000   0.264045
8.000000   0.033708
3.000000   0.028090
Name: employrate, dtype: float64
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.