English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Dati categorici di Pandas

Esempi di operazioni sui dati categorici di Pandas

I dati di solito contengono colonne di testo ripetuti in tempo reale. Genere, regione/nazione e codici funzionali sono sempre ripetuti. Questi sono esempi di dati categorici.
Le variabili categoriche possono assumere solo un numero limitato e spesso fisso di valori possibili. Oltre alla lunghezza fissa, i dati categorici possono avere un ordine, ma non possono essere utilizzati per operazioni numeriche. La categorizzazione è un tipo di dati Pandas.

I dati categorici sono molto utili in alcune circostanze

Una variabile stringa che contiene solo pochi valori diversi. Convertire una variabile stringa del genere in una variabile categorica può risparmiare alcune risorse di memoria.

L'ordine lessicografico delle variabili non corrisponde all'ordine logico (ad esempio, 'un', 'due', 'tre'). Convertendo in categorie e specificando l'ordine in queste, l'ordinamento e il min/max utilizzeranno l'ordine logico anziché lessicografico.

Come segnale di altre librerie Python, questa colonna dovrebbe essere considerata come variabile categorica (ad esempio, utilizzando metodi statistici appropriati o tipi di grafici).

Creazione dell'oggetto

Gli oggetti di categoria possono essere creati in vari modi. Di seguito sono descritte le diverse modalità:

Categorie

Specificando il dtype come "category" durante la creazione dell'oggetto panda.

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

I risultati dell'esecuzione sono come segue:

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

Il numero di elementi passati all'oggetto series è 4, ma la categoria è solo 3. Osserva lo stesso nelle uscite delle categorie.

pd.Categorical

Utilizzando il costruttore standard di pandas per le categorie, possiamo creare un oggetto di categoria.

pandas.Categorical(values, categories, ordered)

Guardiamo un esempio -

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

I risultati dell'esecuzione sono come segue:

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

Guardiamo un altro esempio

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

I risultati dell'esecuzione sono come segue:

 [a, b, c, a, b, c, NaN]
 Categorie (3, oggetto): [c, b, a]

In questo caso, il secondo parametro rappresenta la categoria. Pertanto, qualsiasi valore non esistente nella categoria verrà considerato come NaN.
Ora, guardiamo l'esempio seguente:

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

I risultati dell'esecuzione sono come segue:

 [a, b, c, a, b, c, NaN]
 Categorie (3, oggetto): [c < b < a]

Logicamente, quest'ordine significa che a è maggiore di b e b è maggiore di c.

Descrizione

Utilizzando il comando .describe() per i dati categorici, otteniamo un output simile in una serie o DataFrame di tipo stringa.

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

I risultati dell'esecuzione sono come segue:

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

Ottieni le proprietà delle categorie

Il comando obj.cat.categories viene utilizzato per ottenere le categorie dell'oggetto.

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

I risultati dell'esecuzione sono come segue:

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

Il comando obj.ordered viene utilizzato per ottenere l'ordine dell'oggetto.

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

I risultati dell'esecuzione sono come segue:

   False

La funzione restituisce false perché non abbiamo specificato alcun ordine.

Rinomina delle categorie

La rinomina delle categorie viene completata assegnando un nuovo valore all'attributo s.cat.categories.

 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)

I risultati dell'esecuzione sono come segue:

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

Le categorie iniziali [a, b, c] vengono aggiornate dall'attributo s.cat.categories.

Aggiunta di nuove categorie

È possibile aggiungere nuove categorie utilizzando il metodo Categorical.add_categories().

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

I risultati dell'esecuzione sono come segue:

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

Eliminazione delle categorie

È possibile eliminare le categorie non necessarie utilizzando il metodo Categorical.remove_categories().

 import pandas as pd
 s = pd.Series(["a","b","c","a"], dtype="category")
 print(("Oggetto originale:"))
 print(s)
 print(("Dopo rimozione:"))
 print(s.cat.remove_categories("a"))

I risultati dell'esecuzione sono come segue:

 Oggetto originale:
 0 a
 1 b
 2 c
 3 a
 dtype: category
 Categories (3, object): [a, b, c]
 Dopo la rimozione:
 0 NaN
 1 b
 2 c
 3 NaN
 dtype: category
 Categories (2, object): [b, c]

Confronto dei dati categorici

In tre casi è possibile confrontare i dati categorici con altri oggetti:

Confronta uguale (== e !=) con oggetti simili a liste di lunghezza uguale ai dati categorici (lista, serie, array, ...).

Quando l'ordinamento è == True e le categorie sono le stesse, confronta i dati categorici con tutti i confronti di un'altra serie di categorie (==, !=, >, >=,  < e <=)。< div>    

Confronti di dati categorici con scalari.

Vediamo l'esempio seguente:

 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)

I risultati dell'esecuzione sono come segue:

 0 False
 1 False
 2 True
 dtype: bool