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
yoshiserry
sumber
1
Cobacollections.Counter
metatoaster
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]
EdChum
sumber
@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.

Arran Cudbard-Bell
sumber
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()
Satyajit Dhawale
sumber
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

Roman Kazakov
sumber
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.

Vidhya G
sumber
5

Menggunakan daftar pemahaman dan value_counts untuk banyak kolom dalam df

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

https://stackoverflow.com/a/28192263/786326

Shankar ARUL - jupyterdata.com
sumber
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.

pengguna666
sumber
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}
Timz95
sumber
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
tsando
sumber
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)
RAHUL KUMAR
sumber
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!

dragonfire_007
sumber
0

Gunakan kode ini:

import numpy as np
np.unique(df['a'],return_counts=True)
Harshit Oberoi
sumber
0
your data:

|category|
cat a
cat b
cat a

larutan:

 df['freq'] = df.groupby('category')['category'].transform('count')
 df =  df.drop_duplicates()
Rahul Jain
sumber
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.

djogun
sumber
Anda dapat menambahkan penjelasan singkat tentang cara kode Anda bekerja untuk meningkatkan jawaban Anda.
DobromirM