Lewati ke konten utama

Python Count: Pola Modern, Jebakan, dan Contoh Praktis

Menghitung di Python dengan cepat, memvalidasi data, dan hindari kesalahan umum dengan Counter, count(), dan pandas
· 4 mnt Baca

Jelajahi bersama AI

Menghitung hal-hal terdengar sepele sampai hasilnya meleset sedikit—atau banyak. Saya sering melihat pemeriksaan frekuensi dilakukan dengan pemanggilan list.count() berulang atau metode pandas yang disalahgunakan sehingga diam-diam melewatkan nilai yang hilang. Akibatnya: kode lambat dan angka yang keliru. Solusinya adalah menggunakan alat yang tepat untuk pekerjaan tersebut: collections.Counter untuk peta frekuensi, count() bawaan untuk kueri nilai tunggal yang cepat, dan value_counts() dari pandas saat Anda berada di dalam DataFrame.

Apa itu Counter dan Cara Kerjanya

collections.Counter adalah subclass dictionary untuk menghitung objek yang dapat di-hash (multiset). Anda dapat membangun Counter dari iterable atau mapping. Kunci yang tidak ada akan bernilai default 0; hitungan dapat ditambah atau dikurangi; dan beberapa metode bantu memudahkan tugas umum.

from collections import Counter

# From an iterable (one pass over the data)
nyc_eatery_types = [
    "Mobile Food Truck", "Food Cart", "Snack Bar", "Restaurant", "Food Cart",
    "Restaurant", "Mobile Food Truck", "Snack Bar", "Mobile Food Truck"
]
eatery_type_counts = Counter(nyc_eatery_types)
print(eatery_type_counts)  # dict-like view
print(eatery_type_counts["Restaurant"])  # missing keys return 0 instead of KeyError
print(eatery_type_counts["Kiosk"])
Counter({'Mobile Food Truck': 3, 'Food Cart': 2, 'Snack Bar': 2, 'Restaurant': 2})
2
0

Jangan mengandalkan urutan iterasi sebuah Counter. Saat Anda butuh tampilan berperingkat, gunakan most_common().

Menemukan Nilai Paling Umum dengan most_common()

Counter.most_common(n) mengembalikan daftar pasangan (item, count) dalam urutan menurun berdasarkan hitungan. Berikan n untuk membatasi hasil, atau kosongkan untuk mendapatkan semua pasangan.

top_3 = eatery_type_counts.most_common(3)
print(top_3)
[('Mobile Food Truck', 3), ('Food Cart', 2), ('Snack Bar', 2)]

Gunakan ini saat Anda membutuhkan analitik frekuensi, papan peringkat, atau pemeriksaan cepat atas data kategorikal.

Lebih Banyak dengan Counter

memperbarui dan mengurangkan hitungan

Data bisnis berubah. update() menambah hitungan, sedangkan subtract() menguranginya. Keduanya menerima iterable atau mapping.

new_permits = ["Restaurant", "Food Cart", "Restaurant"]
eatery_type_counts.update(new_permits)  # add 1 for each occurrence
print(eatery_type_counts)

closures = {"Snack Bar": 1}
eatery_type_counts.subtract(closures)   # reduce counts (can go negative)
print(eatery_type_counts)
Counter({'Mobile Food Truck': 3, 'Restaurant': 4, 'Food Cart': 3, 'Snack Bar': 2})
Counter({'Restaurant': 4, 'Mobile Food Truck': 3, 'Food Cart': 3, 'Snack Bar': 1})

Jika suatu hitungan turun ke 0 atau kurang, metode seperti elements() dan most_common() akan mengabaikannya. Untuk menghapus kunci sepenuhnya, gunakan del counter[key].

menghitung total dan top-N

Mulai Python 3.10, Counter.total() mengembalikan jumlah semua hitungan. Ini berguna saat Anda membutuhkan proporsi atau pangsa.

total_permits = eatery_type_counts.total()
for eatery, count in eatery_type_counts.most_common(3):
    share = count / total_permits
    print(f"{eatery}: {count} ({share:.1%})")

membangun ulang urutan dengan elements()

elements() menghasilkan setiap elemen sebanyak hitungannya. Urutannya sewenang-wenang.

expanded = list(eatery_type_counts.elements())
print(len(expanded), "items reconstructed from counts")

menggunakan operasi matematika dan bergaya himpunan

Anda dapat menggabungkan counter dengan operasi aritmetika dan operasi min/maks. Hasilnya membuang hitungan nol dan negatif.

from collections import Counter

a = Counter({"Food Cart": 5, "Restaurant": 2})
b = Counter({"Food Cart": 3, "Snack Bar": 4})

print(a + b)   # add counts
print(a - b)   # subtract (keeps positives only)
print(a & b)   # intersection: min of counts
print(a | b)   # union: max of counts
Counter({'Food Cart': 8, 'Snack Bar': 4, 'Restaurant': 2})
Counter({'Food Cart': 2, 'Restaurant': 2})
Counter({'Food Cart': 3})
Counter({'Food Cart': 5, 'Snack Bar': 4, 'Restaurant': 2})

Kapan Menggunakan list.count(), Counter, atau pandas

Pilih alat paling sederhana yang memenuhi kebutuhan dan batasan kinerja Anda.

pemeriksaan nilai tunggal dengan count()

Gunakan count() bawaan saat Anda hanya perlu mengetahui berapa kali satu nilai muncul dalam sebuah urutan atau jumlah substring tidak bertumpang tindih dalam string.

numbers = [1, 2, 2, 3, 2]
print(numbers.count(2))  # 3

word = "banana"
print(word.count("a"))   # 3

text = "aaa"
print(text.count("aa"))  # 1: non-overlapping matches only
print("cat".count(""))   # 4: empty string counts len(s)+1 positions

Berhati-hatilah dengan boolean dan integer: True == 1 dan False == 0. Ini dapat membesar-besarkan hitungan jika Anda mencampur tipe.

mixed = [1, True, 0, False, True]
print(mixed.count(1))  # 3 (counts 1 and True)
print(mixed.count(0))  # 2 (counts 0 and False)

Hindari memanggil count() berulang di dalam loop pada data besar; setiap panggilan memindai seluruh urutan.

# Inefficient: O(n^2) for large lists
# freq = {x: numbers.count(x) for x in numbers}

# Efficient: one pass
from collections import Counter
freq = Counter(numbers)

banyak frekuensi dengan Counter

Saat Anda membutuhkan hitungan untuk banyak nilai unik, bangun Counter sekali dan kueri sesuai kebutuhan. Jelas, cepat, dan dirancang untuk kasus penggunaan ini.

data tabular dengan pandas

Di pandas, DataFrame.count() dan Series.count() menghitung nilai yang tidak hilang. Untuk mendapatkan tabel frekuensi nilai, gunakan Series.value_counts().

import pandas as pd
df = pd.DataFrame({
    "line": ["A", "A", "B", None, "B", "B"],
    "ridership": [100, None, 120, 130, None, 150],
})

print(df["line"].count())         # 5 (non-missing)
print(df["line"].value_counts())  # value frequencies

# For full row count, use len(df), not df.count()
print(len(df))                    # 6

Validasi dan bersihkan data dengan Counter

Sebelum analisis, saya memeriksa konsistensi kategori, nilai tak terduga, dan duplikasi. Counter membuat pemeriksaan ini cepat dan berulang.

from collections import Counter

# Example: validate allowed categories
allowed_types = {"Mobile Food Truck", "Food Cart", "Snack Bar", "Restaurant"}
type_counts = Counter(nyc_eatery_types)

unexpected = {t: c for t, c in type_counts.items() if t not in allowed_types}
if unexpected:
    print("Unexpected categories found:", unexpected)

# Example: flag duplicates (e.g., station IDs appearing more than once)
station_ids = ["ST-001", "ST-002", "ST-003", "ST-002", "ST-004", "ST-002"]
dup_counts = Counter(station_ids)
duplicates = [sid for sid, c in dup_counts.items() if c > 1]
print("Duplicate station IDs:", duplicates)

Catatan praktis dan jebakan umum

Rincian ini menghemat waktu dan mencegah bug yang halus.

  • Counter mirip dict: kunci yang tidak ada mengembalikan 0; gunakan del counter[key] untuk menghapus entri. Hindari menyimpan nol kecuali Anda membutuhkannya sementara.
  • Jangan mengandalkan urutan iterasi. Gunakan most_common() untuk keluaran berperingkat.
  • str.count() menghitung kecocokan yang tidak bertumpang tindih. Untuk hitungan substring yang bertumpang tindih, gunakan re.finditer().
  • Hindari pemanggilan list.count() berulang pada urutan besar yang sama. Bangun satu Counter saja.
  • Di pandas, .count() untuk hitungan nilai tidak hilang; gunakan .value_counts() untuk frekuensi nilai.

Pola minimal yang saya andalkan

Ini adalah potongan kode yang paling sering saya gunakan di produksi dan pengajaran.

  • Peta frekuensi satu lintasan: Counter(iterable)
  • Kategori Top-N: Counter(data).most_common(n)
  • Pembaruan inkremental: counter.update(batch) atau counter.subtract(batch)
  • Pemeriksaan nilai tunggal: sequence.count(x) (hindari dalam loop)
  • Frekuensi tabular: df["col"].value_counts() (bukan df.count())

Kesimpulan

collections.Counter adalah alat yang tepat untuk menghitung banyak nilai secara cepat dan jelas. Gunakan count() bawaan untuk pemeriksaan satu kali, Counter untuk peta frekuensi dan analisis top-N, serta Series.value_counts() saat Anda bekerja di pandas. Perhatikan kasus tepi penghitungan string, kesetaraan boolean–integer, dan perbedaan antara hitungan nilai tidak hilang dan frekuensi nilai. Dengan pola-pola ini, hitungan Anda akan cepat dan tepat.

Topik

Terkait

blogs

Tutorial Korelasi di R

blogs

Spaghetti Plot dan Jalur Badai