Ana içeriğe geç

Python Count: Modern Kalıplar, Tuzaklar ve Pratik Örnekler

Python’da hızlı sayın, veriyi doğrulayın ve Counter, count() ile pandas sayesinde yaygın hatalardan kaçının
· 4 dk. oku

Yapay Zeka ile Keşfedin

Bir şeyleri saymak, sonuçlar az ya da çok sapınca önemsiz olmaktan çıkar. Sıklık kontrollerinin tekrarlı list.count() çağrılarıyla ya da eksik değerleri sessizce atlayan yanlış pandas yöntemleriyle yapıldığını gördüm. Sonuç: yavaş kod ve hatalı sayılar. Çözüm, işe uygun aracı kullanmaktır: sıklık haritaları için collections.Counter, tek bir değeri hızlıca sorgulamak için yerleşik count() ve DataFrame içindeyken pandas value_counts().

Counter Nedir ve Nasıl Çalışır

collections.Counter, hashlenebilir nesneleri saymak için (çoklu küme) bir sözlük alt sınıfıdır. Bir yinelenebilirden (iterable) ya da eşlemeden (mapping) bir Counter oluşturabilirsiniz. Eksik anahtarların varsayılanı 0’dır; sayımlar artırılıp azaltılabilir; birkaç kullanışlı yöntem yaygın işleri kolaylaştırır.

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

Counter’ın yineleme sırasına güvenmeyin. Sıralı bir görünüm gerektiğinde most_common() kullanın.

En Yaygın Değerleri most_common() ile Bulma

Counter.most_common(n), azalan sayım sırasına göre (öğe, sayı) çiftlerinin bir listesini döndürür. Sonucu sınırlamak için n verin ya da tüm çiftleri almak için atlayın.

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

Bunu sıklık analitiği, sıralama tabloları veya kategorik verilerde hızlı sağlama kontrolleri için kullanın.

Counter ile Daha Fazlası

sayımları update ve subtract ile değiştirme

İş verileri değişir. update() sayımları artırır, subtract() ise azaltır. Her ikisi de yinelenebilirleri veya eşlemeleri kabul eder.

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

Bir sayım 0’a ya da altına düşerse, elements() ve most_common() gibi yöntemler onu yok sayar. Bir anahtarı tamamen kaldırmak için del counter[key] kullanın.

toplamları ve en-İlk N’i hesaplama

Python 3.10’dan itibaren, Counter.total() tüm sayımların toplamını döndürür. Oranlar veya paylar gerektiğinde kullanışlıdır.

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%})")

elements() ile dizileri yeniden kurma

elements(), her öğeyi sayısı kadar verir. Sıra keyfidir.

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

matematik ve küme-tarzı işlemler kullanma

Sayaçları aritmetik ve min/maks tarzı işlemlerle birleştirebilirsiniz. Sonuçlar 0 ve negatif sayımları düşürür.

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

list.count(), Counter veya pandas Ne Zaman Kullanılır

Gereksinimlerinizi ve performans kısıtlarınızı karşılayan en basit aracı seçin.

count() ile tek değer kontrolleri

Bir dizide yalnızca bir değerin kaç kez geçtiğini ya da bir dizgede örtüşmeyen alt dize sayımını bilmeniz gerektiğinde yerleşik count() kullanın.

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

Bool ve tamsayılarla dikkatli olun: True == 1 ve False == 0. Türleri karıştırırsanız sayımlar şişebilir.

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

Büyük verilerde döngüler içinde count()’u tekrar tekrar çağırmaktan kaçının; her çağrı tüm diziyi tarar.

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

Counter ile birden çok sıklık

Birçok benzersiz değer için sayımlar gerektiğinde, bir kez Counter oluşturun ve gerektiğinde sorgulayın. Bu kullanım için açık, hızlı ve tasarlanmıştır.

pandas ile tablosal veriler

pandas’ta, DataFrame.count() ve Series.count() eksik olmayan sayımları hesaplar. Değerlerin bir sıklık tablosunu almak için Series.value_counts() kullanın.

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

Counter ile veriyi doğrulayın ve temizleyin

Analizden önce, kategorik tutarlılığı, beklenmedik değerleri ve yinelenenleri kontrol ederim. Counter bu kontrolleri hızlı ve tekrarlanabilir kılar.

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)

Pratik notlar ve yaygın tuzaklar

Bu ayrıntılar zaman kazandırır ve sinsi hataları önler.

  • Counter sözlük gibidir: eksik anahtarlar 0 döner; girdileri kaldırmak için del counter[key] kullanın. Geçici olarak gerekmedikçe sıfırları depolamaktan kaçının.
  • Yineleme sırasına güvenmeyin. Sıralı çıktı için most_common() kullanın.
  • str.count() örtüşmeyen eşleşmeleri sayar. Örtüşen alt dize sayımları için re.finditer() kullanın.
  • Aynı büyük dizi üzerinde tekrarlı list.count() çağrılarından kaçının. Bunun yerine tek bir Counter oluşturun.
  • pandas’ta .count() eksik-olmayan sayımlar içindir; değer sıklıkları için .value_counts() kullanın.

Sık kullandığım minimal kalıplar

Bunlar, üretimde ve eğitimde en sık kullandığım kod parçacıklarıdır.

  • Tek geçişli sıklık haritası: Counter(iterable)
  • En-İlk N kategoriler: Counter(data).most_common(n)
  • Artımsal güncellemeler: counter.update(batch) veya counter.subtract(batch)
  • Tek değer kontrolü: sequence.count(x) (döngülerde kaçının)
  • Tablosal sıklıklar: df["col"].value_counts() (df.count() değil)

Sonuç

collections.Counter, birden çok değeri hızlı ve anlaşılır biçimde saymak için doğru araçtır. Tek seferlik kontroller için yerleşik count()’u, sıklık haritaları ve en-İlk N analiz için Counter’ı ve pandas ile çalışırken Series.value_counts()’ı kullanın. Dizge sayımındaki köşe durumlarına, boolean–tamsayı eşdeğerliğine ve eksik-olmayan sayımlar ile değer sıklıkları arasındaki farka dikkat edin. Bu kalıplarla sayımlarınız hem hızlı hem doğru olacaktır.

Konular

İlgili