Python Pandas - dane kategoryczne

Często w czasie rzeczywistym dane zawierają powtarzalne kolumny tekstowe. Funkcje takie jak płeć, kraj i kody są zawsze powtarzalne. Oto przykłady danych kategorycznych.

Zmienne kategorialne mogą przyjmować tylko ograniczoną i zwykle stałą liczbę możliwych wartości. Oprócz stałej długości dane kategorialne mogą mieć kolejność, ale nie mogą wykonywać operacji numerycznych. Kategoryczne to typ danych Pandy.

Kategoryczny typ danych jest przydatny w następujących przypadkach:

  • Zmienna łańcuchowa składająca się tylko z kilku różnych wartości. Przekształcenie takiej zmiennej łańcuchowej na zmienną kategorialną pozwoli zaoszczędzić trochę pamięci.

  • Porządek leksykalny zmiennej nie jest taki sam, jak porządek logiczny („jeden”, „dwa”, „trzy”). Konwertując na kategorię i określając kolejność kategorii, sortowanie i min / max użyją kolejności logicznej zamiast porządku leksykalnego.

  • Jako sygnał dla innych bibliotek Pythona, że ​​ta kolumna powinna być traktowana jako zmienna kategorialna (np. Aby zastosować odpowiednie metody statystyczne lub typy wykresów).

Tworzenie obiektów

Obiekt kategorialny można utworzyć na wiele sposobów. Poniżej opisano różne sposoby -

Kategoria

Określając dtype jako „kategorię” podczas tworzenia obiektów pandy.

import pandas as pd

s = pd.Series(["a","b","c","a"], dtype="category")
print s

Jego output wygląda następująco -

0  a
1  b
2  c
3  a
dtype: category
Categories (3, object): [a, b, c]

Liczba elementów przekazanych do obiektu serii to cztery, ale kategorie to tylko trzy. Obserwuj to samo w wyjściowych kategoriach.

pd. kategoryczne

Korzystając ze standardowego konstruktora kategorii pandy, możemy utworzyć obiekt kategorii.

pandas.Categorical(values, categories, ordered)

Weźmy przykład -

import pandas as pd

cat = pd.Categorical(['a', 'b', 'c', 'a', 'b', 'c'])
print cat

Jego output wygląda następująco -

[a, b, c, a, b, c]
Categories (3, object): [a, b, c]

Spójrzmy na inny przykład -

import pandas as pd

cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'])
print cat

Jego output wygląda następująco -

[a, b, c, a, b, c, NaN]
Categories (3, object): [c, b, a]

Tutaj drugi argument oznacza kategorie. W ten sposób każda wartość, której nie ma w kategoriach, będzie traktowana jakoNaN.

Teraz spójrz na następujący przykład -

import pandas as pd

cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'],ordered=True)
print cat

Jego output wygląda następująco -

[a, b, c, a, b, c, NaN]
Categories (3, object): [c < b < a]

Logicznie rzecz biorąc, zamówienie oznacza, że a jest większy niż b i b jest większy niż c.

Opis

Używając .describe() polecenie na danych kategorycznych, otrzymujemy podobny wynik do pliku Series lub DataFrame z type strunowy.

import pandas as pd
import numpy as np

cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
df = pd.DataFrame({"cat":cat, "s":["a", "c", "c", np.nan]})

print df.describe()
print df["cat"].describe()

Jego output wygląda następująco -

cat s
count    3 3
unique   2 2
top      c c
freq     2 2
count     3
unique    2
top       c
freq      2
Name: cat, dtype: object

Pobierz właściwości kategorii

obj.cat.categories polecenie służy do pobierania pliku categories of the object.

import pandas as pd
import numpy as np

s = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print s.categories

Jego output wygląda następująco -

Index([u'b', u'a', u'c'], dtype='object')

obj.ordered polecenie służy do uzyskania kolejności obiektu.

import pandas as pd
import numpy as np

cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print cat.ordered

Jego output wygląda następująco -

False

Funkcja zwróciła false ponieważ nie określiliśmy żadnego zamówienia.

Zmiana nazw kategorii

Zmiana nazw kategorii odbywa się poprzez przypisanie nowych wartości do series.cat.categoriesseries.cat.categories, właściwość.

import pandas as pd

s = pd.Series(["a","b","c","a"], dtype="category")
s.cat.categories = ["Group %s" % g for g in s.cat.categories]
print s.cat.categories

Jego output wygląda następująco -

Index([u'Group a', u'Group b', u'Group c'], dtype='object')

Kategorie początkowe [a,b,c] są aktualizowane przez s.cat.categories własność obiektu.

Dołączanie nowych kategorii

Za pomocą metody Categorical.add.categories () można dołączać nowe kategorie.

import pandas as pd

s = pd.Series(["a","b","c","a"], dtype="category")
s = s.cat.add_categories([4])
print s.cat.categories

Jego output wygląda następująco -

Index([u'a', u'b', u'c', 4], dtype='object')

Usuwanie kategorii

Używając Categorical.remove_categories() niechciane kategorie mogą zostać usunięte.

import pandas as pd

s = pd.Series(["a","b","c","a"], dtype="category")
print ("Original object:")
print s

print ("After removal:")
print s.cat.remove_categories("a")

Jego output wygląda następująco -

Original object:
0  a
1  b
2  c
3  a
dtype: category
Categories (3, object): [a, b, c]

After removal:
0  NaN
1  b
2  c
3  NaN
dtype: category
Categories (2, object): [b, c]

Porównanie danych kategorialnych

Porównanie danych kategorycznych z innymi obiektami jest możliwe w trzech przypadkach -

  • porównywanie równości (== i! =) z obiektem podobnym do listy (lista, seria, tablica, ...) o tej samej długości co dane jakościowe.

  • wszystkie porównania (==,! =,>,> =, <i <=) danych kategorialnych z innymi seriami jakościowymi, gdy uporządkowane == Prawda i kategorie są takie same.

  • wszystkie porównania danych kategorialnych ze skalarem.

Spójrz na następujący przykład -

import pandas as pd

cat = pd.Series([1,2,3]).astype("category", categories=[1,2,3], ordered=True)
cat1 = pd.Series([2,2,2]).astype("category", categories=[1,2,3], ordered=True)

print cat>cat1

Jego output wygląda następująco -

0  False
1  False
2  True
dtype: bool