Tabel frekuensi untuk satu variabel


97

Satu pertanyaan panda pemula terakhir untuk hari ini: Bagaimana cara membuat tabel untuk satu Seri?

Sebagai contoh:

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

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

Banyak googling telah membawa saya ke Series.describe () dan pandas.crosstabs, tetapi tidak satu pun dari ini melakukan apa yang saya butuhkan: satu variabel, dihitung berdasarkan kategori. Oh, dan alangkah baiknya jika itu berfungsi untuk tipe data yang berbeda: string, int, dll.

Jawaban:


153

Mungkinkah .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), untuk mencegah kolom pertama mungkin sedikit rusak
smci

9
Apakah ada padanan untuk DataFrame, daripada seri? Saya mencoba menjalankan .value_counts () pada df dan dapatkanAttributeError: 'DataFrame' object has no attribute 'value_counts'
Mittenchops

1
Apakah ada cara mudah untuk mengubah hitungan ini menjadi proporsi?
dsaxton

7
@dsaxton Anda dapat menggunakan .value_counts (normalize = True) untuk mengubah hasil menjadi proporsi
Max Power

2
Untuk menggunakan ini pada dataframe, ubah menjadi representasi larik numpy 1-D yang setara, seperti - pd.value_counts(df.values.ravel())yang mengembalikan rangkaian yang atribut indexdan nya valuesberisi elemen unik dan jumlahnya masing-masing.
Nickil Maveli

11

Anda dapat menggunakan pemahaman daftar pada kerangka data untuk menghitung frekuensi kolom seperti itu

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

Kerusakan:

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

Hanya memilih data kategorikal

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

Mengubah kolom dari atas menjadi daftar

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

Iterasi melalui daftar di atas dan terapkan value_counts () ke setiap kolom


5

Jawaban yang diberikan oleh @DSM sederhana dan lugas, tetapi saya pikir saya akan menambahkan masukan saya sendiri untuk pertanyaan ini. Jika Anda melihat kode untuk pandas.value_counts , Anda akan melihat bahwa ada banyak hal yang terjadi.

Jika Anda perlu menghitung frekuensi banyak seri, ini bisa memakan waktu cukup lama. Implementasi yang lebih cepat adalah menggunakan numpy.unique denganreturn_counts = True

Berikut ini contohnya:

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

Perhatikan di sini bahwa item yang dikembalikan adalah pandas.Series

Dibandingkan, numpy.unique mengembalikan tupel dengan dua item, nilai unik dan jumlah.

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

Anda kemudian dapat menggabungkan ini ke dalam kamus:

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

Dan kemudian menjadi pandas.Series

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

0

untuk distribusi frekuensi variabel dengan nilai yang berlebihan Anda dapat menciutkan nilai di kelas,

Di sini saya nilai berlebihan untuk employratevariabel, dan tidak ada arti distribusi frekuensinya dengan langsungvalues_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]

distribusi frekuensi values_count(normalize=True)tanpa klasifikasi, panjang hasil di sini adalah 139 (tampaknya tidak berarti sebagai distribusi frekuensi):

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

menempatkan klasifikasi kita meletakkan semua nilai dengan kisaran tertentu yaitu.

0-10 sebagai 1,
11-20 sebagai 2  
21-30 sebagai 3, dan seterusnya.
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))

setelah klasifikasi kami memiliki distribusi frekuensi yang jelas. di sini kita dapat dengan mudah melihat, bahwa 37.64%negara-negara memiliki tingkat pekerjaan antara 51-60% dan 11.79%dari negara-negara yang memiliki tingkat pekerjaan antara71-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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.