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]
@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.
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
Ini akan memberi Anda tabel jumlah nilai yang bagus dan lebih banyak :):
client hotel currency ota user_country
count 852845852845852845852845852845
unique 25541747713214219
top 219813202 USD Hades US
freq 1025628847516500242734340992
@metatoaster sudah menunjukkan ini. Pergi untuk Counter. Sangat cepat.
import pandas as pd
from collections importCounterimport 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 10000Counter(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
collections.Counter
df["category"].value_counts()
?type(df['category'].value_counts())
dan akan berkata demikianJawaban:
Gunakan
groupby
dancount
: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 siniJika Anda ingin menambahkan frekuensi kembali ke kerangka data asli gunakan
transform
untuk mengembalikan indeks yang selaras:sumber
df.['a'].value_counts().reset_index()
bukandf.groupby('a')['a'].transform('count')
?value_counts
akan menghasilkan jumlah frekuensi, jika Anda ingin menambahkan hasilnya kembali sebagai kolom baru terhadap df asli Anda maka Anda harus menggunakantransform
rincian dalam jawaban saya.Jika Anda ingin menerapkan ke semua kolom Anda dapat menggunakan:
Ini akan menerapkan fungsi agregasi berbasis kolom (dalam hal ini value_counts) untuk masing-masing kolom.
sumber
apply
operasi tidak memanfaatkan keunggulan yang disediakan array Numpy sebagai kolom. Akibatnya, kinerja bisa menjadi masalah pada kumpulan data yang lebih besar.Baris kecil kode singkat ini akan memberi Anda output yang Anda inginkan.
Jika nama kolom Anda memiliki ruang yang dapat Anda gunakan
sumber
df['category 1'].value_counts()
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 barisfillna (0) - membuat output lebih mewah. Mengubah NaN menjadi 0
sumber
Dalam 0.18.1
groupby
bersama dengancount
tidak memberikan frekuensi nilai unik:Namun, nilai unik dan frekuensinya mudah ditentukan dengan menggunakan
size
:Dengan
df.a.value_counts()
nilai yang diurutkan (dalam urutan menurun, yaitu nilai terbesar pertama) dikembalikan secara default.sumber
Menggunakan daftar pemahaman dan value_counts untuk banyak kolom dalam df
https://stackoverflow.com/a/28192263/786326
sumber
Jika DataFrame Anda memiliki nilai dengan tipe yang sama, Anda juga dapat mengatur
return_counts=True
di numpy.unique () .index, counts = np.unique(df.values,return_counts=True)
np.bincount () bisa lebih cepat jika nilai Anda bilangan bulat.
sumber
Tanpa perpustakaan, Anda bisa melakukan ini:
Contoh:
sumber
Anda juga dapat melakukan ini dengan panda dengan menyiarkan kolom Anda sebagai kategori pertama, misalnya
dtype="category"
misdan kemudian memanggil
describe
:Ini akan memberi Anda tabel jumlah nilai yang bagus dan lebih banyak :):
sumber
Hitungan nilai unik pertama
Hitungan nilai unik kedua
Keluaran:
Keluaran:
sumber
@metatoaster sudah menunjukkan ini. Pergi untuk
Counter
. Sangat cepat.Pengatur waktu
Bersulang!
sumber
Gunakan kode ini:
sumber
larutan:
sumber
Saya percaya ini harus bekerja dengan baik untuk daftar kolom DataFrame.
Fungsi "column_list" memeriksa nama kolom dan kemudian memeriksa keunikan masing-masing nilai kolom.
sumber