Porady. Pandas. Python. Django. Microsoft Power BI. Tableau.

Pandas. Wykorzystanie value_counts()

12.2024 | pandas | value_counts | python

Funkcja value_counts() w bibliotece Pandas (Python) jest jednym z najprostszych, a zarazem najbardziej praktycznych narzędzi do szybkiego zliczania wystąpień poszczególnych wartości w danych. W świecie e-commerce często chcemy sprawdzić, jak często kupowane są poszczególne produkty lub które kategorie są najbardziej popularne. Dzięki value_counts() możemy w mgnieniu oka dokonać szybkiej analizy, co bardzo pomaga w codziennej pracy z danymi.

W tym artykule pokazujemy, w jaki sposób wykorzystujemy value_counts() w analizie e-commerce i na co zwracamy uwagę.


Podstawowe użycie

Załóżmy, że mamy DataFrame z przykładowymi danymi o sprzedawanych produktach w naszym sklepie internetowym:

import pandas as pd

data = {
    'product_name': ['Koszulka', 'Koszulka', 'Spodnie', 'Buty', 'Buty', 'Buty', 'Czapka'],
    'category': ['Odzież', 'Odzież', 'Odzież', 'Obuwie', 'Obuwie', 'Obuwie', 'Akcesoria'],
    'price': [49.99, 49.99, 89.90, 129.99, 129.99, 129.99, 29.99]
}

df = pd.DataFrame(data)
print(df)

Przykładowy wynik:

  product_name   category   price
0     Koszulka     Odzież   49.99
1     Koszulka     Odzież   49.99
2      Spodnie     Odzież   89.90
3         Buty     Obuwie  129.99
4         Buty     Obuwie  129.99
5         Buty     Obuwie  129.99
6       Czapka  Akcesoria   29.99

Aby zobaczyć, które produkty pojawiają się najczęściej (np. w zamówieniach lub w asortymencie), wywołujemy:

df['product_name'].value_counts()

Wynik:

Buty       3
Koszulka   2
Spodnie    1
Czapka     1
Name: product_name, dtype: int64

Zobaczmy też zliczenie po kategoriach:

df['category'].value_counts()

Wynik:

Obuwie       3
Odzież       3
Akcesoria    1
Name: category, dtype: int64

Sortowanie wyników

Domyślnie value_counts() sortuje wyniki malejąco (najczęściej występująca wartość na górze). Aby zmienić kolejność i posortować rosnąco, używamy parametru ascending=True:

df['product_name'].value_counts(ascending=True)

Wynik:

Spodnie    1
Czapka     1
Koszulka   2
Buty       3
Name: product_name, dtype: int64

Normalizacja wyników

Czasami, zamiast liczby wystąpień, interesuje nas odsetek danego produktu czy kategorii w sprzedaży. W takim przypadku stosujemy parametr normalize=True:

df['product_name'].value_counts(normalize=True)

Wynik (wartości mogą się różnić w zależności od zaokrągleń):

Buty       0.428571
Koszulka   0.285714
Spodnie    0.142857
Czapka     0.142857
Name: product_name, dtype: float64

Dzięki temu widzimy, jaki procent (np. ~42,86% dla „Buty”) stanowią poszczególne produkty.


Zliczanie wartości w kilku kolumnach

Bywa, że potrzebujemy sprawdzić, jak często występują kombinacje wartości — np. jakie produkty w danej kategorii są najpopularniejsze. Możemy do tego użyć value_counts() na wielu kolumnach:

df[['category', 'product_name']].value_counts()

Wynik:

category    product_name
Obuwie      Buty           3
Odzież      Koszulka       2
            Spodnie        1
Akcesoria   Czapka         1
dtype: int64

W ten sposób widzimy, że w kategorii „Obuwie” królują „Buty”, a w „Odzieży” — „Koszulka”.

Możemy też sięgnąć po groupby() i size():

df.groupby(['category', 'product_name']).size().reset_index(name='counts')

Wynik:

     category product_name  counts
0   Akcesoria       Czapka       1
1     Obuwie         Buty       3
2     Odzież     Koszulka       2
3     Odzież      Spodnie       1

Szybkie filtrowanie i liczenie

Czasami interesują nas produkty, które występują więcej niż raz. Możemy wykorzystać value_counts() do zbudowania filtra:

product_counts = df['product_name'].value_counts()
duplikaty = product_counts[product_counts > 1].index
df_duplikaty = df[df['product_name'].isin(duplikaty)]

print(df_duplikaty)

Wynik:

  product_name category   price
0     Koszulka  Odzież    49.99
1     Koszulka  Odzież    49.99
3         Buty  Obuwie   129.99
4         Buty  Obuwie   129.99
5         Buty  Obuwie   129.99

W ten sposób otrzymujemy tylko te wiersze, w których dany produkt występuje częściej niż raz.


Parametr dropna

Często w danych e-commerce napotykamy brakujące wartości (NaN) — np. brak kategorii w niektórych rekordach. Domyślnie value_counts() nie uwzględnia braków danych, ale wystarczy ustawić dropna=False, by je zliczyć:

df_with_nan = pd.DataFrame({
    'product_name': ['Buty', None, 'Koszulka', None, 'Spodnie']
})

print(df_with_nan['product_name'].value_counts(dropna=False))

Wynik:

Buty        1
Koszulka    1
Spodnie     1
NaN         2
Name: product_name, dtype: int64

Podsumowanie

  • value_counts() to prosta i niezwykle przydatna metoda w Pandas do zliczania wystąpień wartości — idealna w analizie e-commerce (np. do sprawdzania popularności produktów, kategorii).
  • Domyślnie wyniki są sortowane malejąco, ale parametrem ascending=True możemy to łatwo zmienić.
  • Za pomocą normalize=True otrzymujemy udziały procentowe zamiast liczbowej ilości wystąpień.
  • Analizę wielu kolumn przeprowadzamy przez [['col1', 'col2']].value_counts() lub funkcję groupby().
  • Brakujące dane (NaN) można włączyć do zliczeń, ustawiając dropna=False.
  • value_counts() świetnie sprawdza się w tworzeniu filtrów, np. do wyłapania popularnych lub rzadko zamawianych produktów.

Warto z tego narzędzia korzystać już na wczesnym etapie analizy — pozwala nam szybko zorientować się w strukturze danych i wyłapać kluczowe informacje (np. najchętniej kupowane produkty), co przekłada się na lepsze decyzje biznesowe. Powodzenia w analizie!

Wdrażam rozwiązania analityczne, buduję raporty zarządcze i pomagam zrozumieć dane.

Korzystam z Google Marketing Cloud, Microsoft Power BI, Google Cloud oraz Python.

Pracowałem m.in. dla Credit Suisse, Phonak, Hansaton, Unitron, Nestle, IBM, Play.

Jestem współtwórcą grupy Hexe Capital SA.

Zapraszam do lektury i współpracy.

Krzysztof Surowiecki

Chcę porozmawiać o współpracy →

Moje certyfikaty