hitung frekuensi suatu nilai terjadi di kolom dataframe


313

Saya punya dataset

|category|
cat a
cat b
cat a

Saya ingin dapat mengembalikan sesuatu seperti (menampilkan nilai dan frekuensi unik)

category | freq |
cat a       2
cat b       1


94
Apakah Anda mencari df["category"].value_counts()?
DSM

Saat menggunakan "df [" kategori "]. Value_counts ()" ia mengatakan itu int? tetapi mengembalikan nama kolom sebagai indeks? Apakah itu objek dataframe atau entah bagaimana menggabungkan serangkaian (jumlah) dan nilai kolom unik asli?
yoshiserry

@Yoshiserry ini adalah seri Pandas type(df['category'].value_counts())dan akan berkata demikian
EdChum

Saya lakukan, dan saya terkejut dengan itu tetapi masuk akal semakin saya memikirkannya. Setelah melakukan ini, nilai diperhitungkan pada beberapa kolum, ada baris yang ingin saya kecualikan. Saya tahu cara menghapus kolom tetapi bagaimana cara mengecualikan baris?
yoshiserry

Jawaban:


414

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

Lihat dokumen online: http://pandas.pydata.org/pandas-docs/stable/groupby.html

Juga value_counts()sebagai @DSM telah berkomentar, banyak cara untuk kulit kucing di sini

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

Out[38]:

b    3
a    2
s    2
dtype: int64

Jika Anda ingin menambahkan frekuensi kembali ke kerangka data asli gunakan transformuntuk mengembalikan indeks yang selaras:

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 Tidak, yang Anda lihat adalah bahwa ia menciptakan serangkaian yang sejajar dengan kerangka data asli, tidak seperti metode lain yang menampilkan nilai unik dan frekuensinya, jika Anda hanya ingin menambahkan penghitungan frekuensi kembali ke kerangka data yang dapat Anda gunakan transformasi untuk ini. Ini hanyalah teknik lain, Anda perhatikan bahwa itu belum menciutkan kerangka data setelah menetapkan kembali dan tidak ada nilai yang hilang. Saya juga berpikir bahwa Dataframe selalu memiliki indeks. Saya tidak berpikir Anda dapat menyingkirkannya, hanya meresetnya, menetapkan yang baru atau menggunakan kolom sebagai indeks
EdChum

4
Pada contoh kode pertama Anda, df ditugaskan seperti yang diharapkan, tetapi baris ini: df.groupby ('a'). Count () mengembalikan kerangka data kosong. Mungkinkah jawaban ini kedaluwarsa dengan panda 0.18.1? Selain itu, agak membingungkan bahwa nama kolom Anda 'a' sama dengan nilai yang Anda cari 'a'. Saya akan mengeditnya sendiri tetapi karena kode tidak berfungsi untuk saya, saya tidak dapat memastikan hasil edit saya.
Alex

1
@Alex Anda benar sepertinya dalam versi terbaru ini tidak berfungsi lagi, sepertinya bug bagi saya karena saya tidak melihat mengapa tidak
EdChum

1
Mengapa tidak menggunakan df.['a'].value_counts().reset_index()bukan df.groupby('a')['a'].transform('count')?
tandem

1
@tandem, mereka melakukan hal yang berbeda, panggilan value_countsakan menghasilkan jumlah frekuensi, jika Anda ingin menambahkan hasilnya kembali sebagai kolom baru terhadap df asli Anda maka Anda harus menggunakan transformrincian dalam jawaban saya.
EdChum

93

Jika Anda ingin menerapkan ke semua kolom Anda dapat menggunakan:

df.apply(pd.value_counts)

Ini akan menerapkan fungsi agregasi berbasis kolom (dalam hal ini value_counts) untuk masing-masing kolom.


10
Ini adalah jawaban yang paling sederhana. Ini harus di atas.
Jeffrey Jose

4
Jawaban ini sederhana tapi (saya percaya) applyoperasi tidak memanfaatkan keunggulan yang disediakan array Numpy sebagai kolom. Akibatnya, kinerja bisa menjadi masalah pada kumpulan data yang lebih besar.
kuanb

58
df.category.value_counts()

Baris kecil kode singkat ini akan memberi Anda output yang Anda inginkan.

Jika nama kolom Anda memiliki ruang yang dapat Anda gunakan

df['category'].value_counts()

2
Atau gunakan [] jika nama kolom memiliki ruang. df['category 1'].value_counts()
Jacob Kalakal Joseph

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

value_counts - Mengembalikan objek yang berisi jumlah nilai unik

terapkan - hitung frekuensi di setiap kolom. Jika Anda mengatur axis=1, Anda mendapatkan frekuensi di setiap baris

fillna (0) - membuat output lebih mewah. Mengubah NaN menjadi 0


1
Ini sangat kuat ketika menghitung kemunculan nilai di seluruh kolom untuk baris yang sama !!
amc

14

Dalam 0.18.1 groupbybersama dengan counttidak memberikan frekuensi nilai unik:

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

Namun, nilai unik dan frekuensinya mudah ditentukan dengan menggunakan size:

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

Dengan df.a.value_counts()nilai yang diurutkan (dalam urutan menurun, yaitu nilai terbesar pertama) dikembalikan secara default.



5

Jika DataFrame Anda memiliki nilai dengan tipe yang sama, Anda juga dapat mengatur return_counts=Truedi numpy.unique () .

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

np.bincount () bisa lebih cepat jika nilai Anda bilangan bulat.


4

Tanpa perpustakaan, Anda bisa melakukan ini:

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

Contoh:

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

1

Anda juga dapat melakukan ini dengan panda dengan menyiarkan kolom Anda sebagai kategori pertama, misalnya dtype="category"mis

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

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

dan kemudian memanggil describe:

df[cats].describe()

Ini akan memberi Anda tabel jumlah nilai yang bagus dan lebih banyak :):

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

Hitungan nilai unik pertama

n_at_most_50k = n_values[0]

Hitungan nilai unik kedua

n_greater_50k = n_values[1]

n_values

Keluaran:

<=50K    34014
>50K     11208

Name: income, dtype: int64

Keluaran:

n_greater_50k,n_at_most_50k:-
(11208, 34014)

0

@metatoaster sudah menunjukkan ini. Pergi untuk Counter. Sangat cepat.

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

Pengatur waktu

%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

Bersulang!



0
your data:

|category|
cat a
cat b
cat a

larutan:

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

0

Saya percaya ini harus bekerja dengan baik untuk daftar kolom 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"})

Fungsi "column_list" memeriksa nama kolom dan kemudian memeriksa keunikan masing-masing nilai kolom.


Anda dapat menambahkan penjelasan singkat tentang cara kode Anda bekerja untuk meningkatkan jawaban Anda.
DobromirM
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.