Skip to content

pandas: Selezionare righe/colonne in DataFrame indicizzando “[]”.

Python

È 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.