
È possibile selezionare e ottenere righe, colonne ed elementi in pandas.DataFrame e pandas.Series tramite gli operatori di indicizzazione (parentesi quadre) [].
In questo articolo vengono descritti i seguenti contenuti.
- Seleziona le colonne di panda.DataFrame
- [Nome colonna]: ottieni una singola colonna come Serie
- [Elenco dei nomi delle colonne]: ottieni colonne singole o multiple come DataFrame
- Seleziona le righe di panda.DataFrame
- [Slice of row name/number]: ottieni righe singole o multiple come DataFrame
- [Matrice/serie booleana]: ottieni righe True come DataFrame
- Seleziona elementi di pandas.Serie
- [Etichetta/posizione]: Ottieni il valore di un singolo elemento
- [Elenco di etichette/posizioni]: ottieni elementi singoli o multipli come serie
- [Slice of label/position]: ottieni elementi singoli o multipli come serie
- [Matrice booleana/serie]: ottieni elementi True come serie
- Seleziona gli elementi di pandas.DataFrame
- Si noti che i nomi di riga e colonna sono interi
Puoi anche selezionare le colonne per sezione e le righe per nome/numero o il loro elenco con loc e iloc.
Il seguente file CSV utilizzatore viene in questo codice di esempio.
import pandas as pd
print(pd.__version__)
# 1.4.1
df = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0)
print(df)
# age state point
# name
# Alice 24 NY 64
# Bob 42 CA 92
# Charlie 18 CA 70
# Dave 68 TX 70
# Ellen 24 CA 88
# Frank 30 NY 57
Seleziona le colonne di panda.DataFrame
[Nome colonna]: ottieni una singola colonna come pandas.Series
È possibile ottenere la colonna come pandas.Series specificando il nome della colonna (etichetta) in [].
print(df['age'])
print(type(df['age']))
# name
# Alice 24
# Bob 42
# Charlie 18
# Dave 68
# Ellen 24
# Frank 30
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
Puoi anche specificare i nomi delle colonne come un attributo, come .. Tieni presente che se il nome della colonna è in conflitto con i nomi dei metodi esistenti, il metodo ha la precedenza.
print(df.age)
print(type(df.age))
# name
# Alice 24
# Bob 42
# Charlie 18
# Dave 68
# Ellen 24
# Frank 30
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
[Elenco dei nomi delle colonne]: ottieni colonne singole o multiple come panda.DataFrame
Puoi ottenere più colonne come pandas.DataFrame specificando un elenco di nomi di colonne in []. Le colonne saranno nell’ordine dell’elenco specificato.
print(df[['point', 'age']])
print(type(df[['point', 'age']]))
# point age
# name
# Alice 64 24
# Bob 92 42
# Charlie 70 18
# Dave 70 68
# Ellen 88 24
# Frank 57 30
# <class 'pandas.core.frame.DataFrame'>
Se si specifica un elenco con un elemento, viene restituita una singola colonna pandas.DataFrame, non pandas.Series.
print(df[['age']])
print(type(df[['age']]))
# age
# name
# Alice 24
# Bob 42
# Charlie 18
# Dave 68
# Ellen 24
# Frank 30
# <class 'pandas.core.frame.DataFrame'>
Puoi anche specificare una porzione del nome della colonna con loc o un numero di colonna con iloc. Vedere il seguente articolo per i dettagli.
print(df.loc[:, 'age':'state'])
print(type(df.loc[:, 'age':'state']))
# age state
# name
# Alice 24 NY
# Bob 42 CA
# Charlie 18 CA
# Dave 68 TX
# Ellen 24 CA
# Frank 30 NY
# <class 'pandas.core.frame.DataFrame'>
print(df.iloc[:, [2, 0]])
print(type(df.iloc[:, [2, 0]]))
# point age
# name
# Alice 64 24
# Bob 92 42
# Charlie 70 18
# Dave 70 68
# Ellen 88 24
# Frank 57 30
# <class 'pandas.core.frame.DataFrame'>
Seleziona le righe di panda.DataFrame
[Slice of row name/number]: ottieni una o più righe come pandas.DataFrame
Puoi ottenere più righe come pandas.DataFrame specificando una fetta in [].
print(df[1:4])
print(type(df[1:4]))
# age state point
# name
# Bob 42 CA 92
# Charlie 18 CA 70
# Dave 68 TX 70
# <class 'pandas.core.frame.DataFrame'>
È possibile specificare un valore negativo e un passaggio (start:stop:step) come in una normale fetta. Ad esempio, puoi utilizzare le sezioni per estrarre pari o dispari.
print(df[:-3])
print(type(df[:-3]))
# age state point
# name
# Alice 24 NY 64
# Bob 42 CA 92
# Charlie 18 CA 70
# <class 'pandas.core.frame.DataFrame'>
print(df[::2])
print(type(df[::2]))
# age state point
# name
# Alice 24 NY 64
# Charlie 18 CA 70
# Ellen 24 CA 88
# <class 'pandas.core.frame.DataFrame'>
print(df[1::2])
print(type(df[1::2]))
# age state point
# name
# Bob 42 CA 92
# Dave 68 TX 70
# Frank 30 NY 57
# <class 'pandas.core.frame.DataFrame'>
Viene generato un errore se viene specificato un numero di riga da solo invece di una sezione.
# print(df[1])
# KeyError: 1
Se viene selezionata solo una riga, viene restituito pandas.DataFrame, non pandas.Series.
print(df[1:2])
print(type(df[1:2]))
# age state point
# name
# Bob 42 CA 92
# <class 'pandas.core.frame.DataFrame'>
Puoi anche specificare una porzione del nome della riga (etichetta) invece del numero della riga (posizione). Nel caso di una fetta con nome di riga, viene inclusa la riga di arresto.
print(df['Bob':'Ellen'])
print(type(df['Bob':'Ellen']))
# age state point
# name
# Bob 42 CA 92
# Charlie 18 CA 70
# Dave 68 TX 70
# Ellen 24 CA 88
# <class 'pandas.core.frame.DataFrame'>
È possibile specificare solo il nome/numero della riga o il relativo elenco con loc o iloc. Vedere il seguente articolo per i dettagli.
print(df.loc['Bob'])
print(type(df.loc['Bob']))
# age 42
# state CA
# point 92
# Name: Bob, dtype: object
# <class 'pandas.core.series.Series'>
print(df.loc[['Bob', 'Ellen']])
print(type(df.loc[['Bob', 'Ellen']]))
# age state point
# name
# Bob 42 CA 92
# Ellen 24 CA 88
# <class 'pandas.core.frame.DataFrame'>
print(df.iloc[[1, 4]])
print(type(df.iloc[[1, 4]]))
# age state point
# name
# Bob 42 CA 92
# Ellen 24 CA 88
# <class 'pandas.core.frame.DataFrame'>
[Matrice/serie booleana]: ottieni righe vere come pandas.DataFrame
Specificando un array booleano (list o numpy.ndarray) in [], puoi estrarre le righe True come pandas.DataFrame.
l_bool = [True, False, False, True, True, False]
print(df[l_bool])
# age state point
# name
# Alice 24 NY 64
# Dave 68 TX 70
# Ellen 24 CA 88
Viene generato un errore se il numero di elementi non corrisponde.
# print(df[[True, False, False]])
# ValueError: Item wrong length 3 instead of 6.
Puoi anche specificare il booleano pandas.Series. Le righe vengono estratte in base alle etichette, non all’ordine.
s_bool = pd.Series(l_bool, index=reversed(df.index))
print(s_bool)
# Frank True
# Ellen False
# Dave False
# Charlie True
# Bob True
# Alice False
# dtype: bool
print(df[s_bool])
# age state point
# name
# Bob 42 CA 92
# Charlie 18 CA 70
# Frank 30 NY 57
Viene generato un errore se il numero di elementi o etichette non corrisponde.
s_bool_wrong = pd.Series(l_bool, index=['A', 'B', 'C', 'D', 'E', 'F'])
# print(df[s_bool_wrong])
# IndexingError: Unalignable boolean Series provided as indexer
# (index of the boolean Series and of the indexed object do not match).
Seleziona elementi di pandas.Serie
Usa il seguente pandas.Series come esempio.
s = df['age']
print(s)
# name
# Alice 24
# Bob 42
# Charlie 18
# Dave 68
# Ellen 24
# Frank 30
# Name: age, dtype: int64
[Etichetta/posizione]: Ottieni il valore di un singolo elemento
È possibile ottenere il valore dell’elemento specificando solo l’etichetta/posizione (indice). Quando si specifica per posizione (indice), è possibile utilizzare un valore negativo per specificare la posizione dalla fine. -1 è la coda.
Puoi anche specificare il nome dell’etichetta come attributo, ad esempio .
print(s[3])
print(type(s[3]))
# 68
# <class 'numpy.int64'>
print(s['Dave'])
print(type(s['Dave']))
# 68
# <class 'numpy.int64'>
print(s[-1])
print(type(s[-1]))
# 30
# <class 'numpy.int64'>
print(s.Dave)
print(type(s.Dave))
# 68
# <class 'numpy.int64'>
[Elenco di etichette/posizioni]: ottieni elementi singoli o multipli come pandas.Serie
È possibile selezionare più valori come panda.Serie specificando un elenco di etichette/posizioni. Gli elementi saranno nell’ordine dell’elenco specificato.
print(s[[1, 3]])
print(type(s[[1, 3]]))
# name
# Bob 42
# Dave 68
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
print(s[['Bob', 'Dave']])
print(type(s[['Bob', 'Dave']]))
# name
# Bob 42
# Dave 68
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
Se viene specificato un elenco con un elemento, viene restituito pandas.Series.
print(s[[1]])
print(type(s[[1]]))
# name
# Bob 42
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
print(s[['Bob']])
print(type(s[['Bob']]))
# name
# Bob 42
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
[Slice of label/position]: ottieni elementi singoli o multipli come pandas.Series
Puoi anche selezionare più valori come pandas.Series specificando una porzione di etichetta/posizione. Nel caso di un nome di etichetta, è incluso l’elemento stop.
print(s[1:3])
print(type(s[1:3]))
# name
# Bob 42
# Charlie 18
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
print(s['Bob':'Dave'])
print(type(s['Bob':'Dave']))
# name
# Bob 42
# Charlie 18
# Dave 68
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
Se viene selezionato un elemento, viene restituito pandas.Series.
print(s[1:2])
print(type(s[1:2]))
# name
# Bob 42
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
print(s['Bob':'Bob'])
print(type(s['Bob':'Bob']))
# name
# Bob 42
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
[Matrice/serie booleana]: ottieni elementi True come pandas.Series
Specificando un array booleano (list o numpy.ndarray) in [], puoi estrarre gli elementi True come pandas.Series.
l_bool = [True, False, False, True, True, False]
print(s[l_bool])
# name
# Alice 24
# Dave 68
# Ellen 24
# Name: age, dtype: int64
Viene generato un errore Se il numero di elementi non corrisponde.
# print(s[[True, False, False]])
# IndexError: Boolean index has wrong length: 3 instead of 6
Puoi anche specificare il booleano pandas.Series. Gli elementi vengono estratti in base alle etichette, non all’ordine.
s_bool = pd.Series(l_bool, index=reversed(df.index))
print(s_bool)
# Frank True
# Ellen False
# Dave False
# Charlie True
# Bob True
# Alice False
# dtype: bool
print(s[s_bool])
# name
# Bob 42
# Charlie 18
# Frank 30
# Name: age, dtype: int64
Viene generato un errore se il numero di elementi o etichette non corrisponde.
s_bool_wrong = pd.Series(l_bool, index=['A', 'B', 'C', 'D', 'E', 'F'])
# print(s[s_bool_wrong])
# IndexingError: Unalignable boolean Series provided as indexer
# (index of the boolean Series and of the indexed object do not match).
Seleziona gli elementi di pandas.DataFrame
È possibile ottenere il valore di un elemento da pandas.DataFrame estraendo pandas.Series da pandas.DataFrame e quindi ottenendo il valore da tale pandas.Series.
print(df['age']['Alice'])
# 24
Puoi anche estrarre qualsiasi gruppo per sezioni o elenchi.
print(df['Bob':'Dave'][['age', 'point']])
# age point
# name
# Bob 42 92
# Charlie 18 70
# Dave 68 70
Tuttavia, in questo modo ([…]] […]) viene chiamato indicizzazione concatenata e può comportare un SettingWithCopyWarning durante l’assegnazione dei valori.
È possibile selezionare righe o colonne contemporaneamente con at, iat, loc o iloc.
print(df.at['Alice', 'age'])
# 24
print(df.loc['Bob':'Dave', ['age', 'point']])
# age point
# name
# Bob 42 92
# Charlie 18 70
# Dave 68 70
Si noti che i nomi di riga e colonna sono interi
Fai attenzione quando i nomi di riga e colonna sono interi.
Usa il seguente pandas.DataFrame come esempio.
df = pd.DataFrame([[0, 10, 20], [30, 40, 50], [60, 70, 80]],
index=[2, 0, 1], columns=[1, 2, 0])
print(df)
# 1 2 0
# 2 0 10 20
# 0 30 40 50
# 1 60 70 80
Se [valore scalare] o [elenco], il valore specificato viene considerato un nome di colonna.
print(df[0])
# 2 20
# 0 50
# 1 80
# Name: 0, dtype: int64
print(df[[0, 2]])
# 0 2
# 2 20 10
# 0 50 40
# 1 80 70
Se [slice], il valore specificato è considerato un numero di riga, non un nome di riga. Sono ammessi anche valori negativi.
print(df[:2])
# 1 2 0
# 2 0 10 20
# 0 30 40 50
print(df[-2:])
# 1 2 0
# 0 30 40 50
# 1 60 70 80
Utilizzare loc o iloc per specificare chiaramente se si tratta di un nome (etichetta) o di un numero (posizione).
print(df.loc[:2])
# 1 2 0
# 2 0 10 20
print(df.iloc[:2])
# 1 2 0
# 2 0 10 20
# 0 30 40 50
Per panda.Serie:
s = df[2]
print(s)
# 2 10
# 0 40
# 1 70
# Name: 2, dtype: int64
In pandas.Series, il valore specificato è considerato un’etichetta, non un indice.
Use at o iat per specificare chiaramente se si tratta di un’etichetta o di un indice.
print(s.at[0])
# 40
print(s.iat[0])
# 10
Si noti che se si specifica [-1], viene considerato un’etichetta denominata -1, non la coda. Puoi usarla.
# print(s[-1])
# KeyError: -1
print(s.iat[-1])
# 70
Pertanto, è meglio usare at, iat, loc o iloc quando il nome della riga o della colonna è un numero intero.