Skip to content

pandas: Zeilen/Spalten in DataFrame durch Indizierung „[]“ auswählen

Python

Sie können Zeilen, Spalten und Elemente in pandas.DataFrame und pandas.Series auswählen und abrufen, indem Sie Operatoren (eckige Klammern) [] indizieren.

Dieser Artikel hat folgenden Inhalt.

  • Wählen Sie Spalten von pandas.DataFrame aus
    • [Spaltenname]: Holen Sie sich eine einzelne Spalte als Serie
    • [Liste der Spaltennamen]: Holen Sie sich Einzelne oder mehrere Spalten als DataFrame
  • Wählen Sie Zeilen von pandas.DataFrame aus
    • [Slice of row name/number]: Holen Sie sich einzelne oder mehrere Zeilen als DataFrame
    • [Boolean array/Series]: Holen Sie sich True-Zeilen als DataFrame
  • Wählen Sie Elemente der pandas.Series aus
    • [Label/Position]: Ruft den Wert eines einzelnen Elements ab
    • [Liste der Labels/Positionen]: Holen Sie sich Einzelne oder mehrere Elemente als Serie
    • [Slice of label/position]: Holen Sie sich Einzelne oder mehrere Elemente als Serie
    • [Boolean array/Series]: Wahre Elemente als Serie erhalten
  • Wählen Sie Elemente von pandas.DataFrame aus
  • Beachten Sie, dass Zeilen- und Spaltennamen ganze Zahlen sind

Sie können Spalten auch nach Slice und Zeilen nach Name/Nummer oder deren Liste mit loc und iloc auswählen.

Die folgende CSV-Datei wird in diesem Beispielcode verwendet.

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

Wählen Sie Spalten von pandas.DataFrame aus

[Spaltenname]: Holen Sie sich eine einzelne Spalte als pandas.Series

Sie können die Spalte als pandas.Series erhalten, indem Sie den Spaltennamen (Label) in [] angeben.

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'>

Sie können auch Spaltennamen als Attribut angeben, z. B… Beachten Sie, dass die Methode Vorrang hat, wenn der Spaltenname mit vorhandenen Methodennamen in Konflikt steht.

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'>

[Liste der Spaltennamen]: Holen Sie sich Einzelne oder mehrere Spalten als pandas.DataFrame

Sie können mehrere Spalten als pandas.DataFrame erhalten, indem Sie eine Liste von Spaltennamen in [] angeben. Die Spalten werden in der Reihenfolge der angegebenen Liste angeordnet.

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'>

Wenn Sie eine Liste mit einem Element angeben, wird eine einzelne Spalte pandas.DataFrame zurückgegeben, nicht 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'>

Sie können auch einen Teil des Spaltennamens mit loc oder eine Spaltennummer mit iloc angeben. Nichts finden Sie im folgenden Artikel.

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'>

Wählen Sie Zeilen von pandas.DataFrame aus

[Slice of row name/number]: Holen Sie sich einzelne oder mehrere Zeilen als pandas.DataFrame

Sie können mehrere Zeilen als pandas.DataFrame erhalten, ohne dass Sie einen Slice in [] angeben.

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'>

Sie können einen negativen Wert und Schritt (start:stop:step) wie bei einem normalen Slice angeben. Sample can SIE Slices verwenden, um ungerade oder gerade Zeilen zu extrahieren.

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'>

Es WIRD Ein Fehler ausgelöst, WENN anstelle Eines Slice Nur Eine Zeilennummer angegeben WIRD.

# print(df[1])
# KeyError: 1

Wenn nur eine Zeile ausgewählt ist, wird pandas.DataFrame zurückgegeben, nicht pandas.Series.

print(df[1:2])
print(type(df[1:2]))
#       age state  point
# name                  
# Bob    42    CA     92
# <class 'pandas.core.frame.DataFrame'>

SIE can anstelle der Zeilennummer (Position) auch einen Zeilennamen (Label) angeben. Bei Einem Slice mit Zeilenname ist die Stop-Zeile enthalten.

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'>

Sie können den Zeilennamen/die Zeilennummer allein oder ihre Liste mit loc oder iloc angeben. Nichts finden Sie im folgenden Artikel.

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'>

[Boolean array/Series]: Holen Sie sich True-Zeilen als pandas.DataFrame

Durch Angabe eines booleschen Arrays (list oder numpy.ndarray) in [] können SIE die True-Zeilen als pandas.DataFrame extrahieren.

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

Ein Fehler wird ausgelöst, wenn die Anzahl der Elemente nicht sichtbar ist.

# print(df[[True, False, False]])
# ValueError: Item wrong length 3 instead of 6.

Sie können auch den booleschen Wert pandas.Series angeben. Zeilen werden basierend auf Beschriftungen extrahiert, nicht auf der Grundlage der Reihenfolge.

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

Ein Fehler wird ausgelöst, wenn die Anzahl der Elemente oder Labels nicht gefunden wird.

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

Wählen Sie Elemente der pandas.Series aus

Verwenden Sie die folgenden Pandas.Series als Beispiel.

s = df['age']
print(s)
# name
# Alice      24
# Bob        42
# Charlie    18
# Dave       68
# Ellen      24
# Frank      30
# Name: age, dtype: int64

[Label/Position]: Ruft den Wert eines einzelnen Elements ab

Sie können den Wert des Elements erhalten, ohne dass Sie nur die Bezeichnung/Position (Index) angeben. Bei der Angabe nach Position (Index) kann ein negativer Wert used Werden, um die Position vom Ende her anzugeben. -1 ist der Schwanz.

Sie können den Labelnamen auch als Attribut angeben, z. B. .

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'>

[Liste der Labels/Positionen]: Holen Sie sich Einzelne oder mehrere Elemente als pandas.Series

Sie können mehrere Werte als pandas.Series auswählen, indem Sie eine Liste mit Labels/Positionen angeben. Die Elemente befinden sich in der Reihenfolge der angegebenen Liste.

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'>

Wenn eine Liste mit einem Element angegeben WIRD, WIRD pandas.Series zurückgegeben.

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]: Holen Sie sich Einzelne oder mehrere Elemente als pandas.Series

Sie können auch mehrere Werte als pandas.Series auswählen, indem Sie einen Abschnitt der Beschriftung/Position angeben. Bei Einem Labelnamen ist das Stop-Element enthalten.

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'>

Wenn ein Element ausgewählt ist, wird pandas.Series zurückgegeben.

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'>

[Boolean array/Series]: Holen Sie sich True-Elemente als pandas.Series

Durch Angabe eines booleschen Arrays (list oder numpy.ndarray) in [] can you the True-Elemente as pandas.Series extrahieren.

l_bool = [True, False, False, True, True, False]
print(s[l_bool])
# name
# Alice    24
# Dave     68
# Ellen    24
# Name: age, dtype: int64

Ein Fehler wird ausgelöst, wenn die Anzahl der Elemente nicht sichtbar ist.

# print(s[[True, False, False]])
# IndexError: Boolean index has wrong length: 3 instead of 6

Sie können auch den booleschen Wert pandas.Series angeben. Elemente werden basierend auf Labels extrahiert, nicht auf der Grundlage der Reihenfolge.

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

Ein Fehler wird ausgelöst, wenn die Anzahl der Elemente oder Labels nicht gefunden wird.

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

Wählen Sie Elemente von pandas.DataFrame aus

Sie können den Wert eines Elements aus pandas.DataFrame abrufen, indem Sie pandas.Series aus pandas.DataFrame extrahieren und dann den Wert aus dieser pandas.Series abrufen.

print(df['age']['Alice'])
# 24

Sie können auch jede Gruppe nach Slices oder Listen extrahieren.

print(df['Bob':'Dave'][['age', 'point']])
#          age  point
# name               
# Bob       42     92
# Charlie   18     70
# Dave      68     70

Dieser Weg ([…]] […]) WIRD jedoch als verkettete Indizierung bezeichnet und kann bei der Zuweisung von Werten zu Einer SettingWithCopyWarning führen.

Sie können Zeilen oder Spalten mit gleichzeitig at, iat, loc oder iloc auswählen.

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

Beachten Sie, dass Zeilen- und Spaltennamen ganze Zahlen sind

Seien Sie vorsichtig, wenn Zeilen- und Spaltennamen Ganzzahlen sind.

Verwenden Sie den following pandas.DataFrame als Beispiel.

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

Bei [Skalarwert] oder [Liste] WIRD der angegebene Wert als Spaltenname betrachtet.

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

Bei [slice] WIRD der angegebene Wert als Zeilennummer und nicht als Zeilenname betrachtet. Auch negative Werte sind erlaubt.

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

Verwenden Sie loc oder iloc, um eindeutig anzugeben, ob es sich um einen Namen (Label) oder eine Nummer (Position) handelt.

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

Für Pandas.Serie:

s = df[2]
print(s)
# 2    10
# 0    40
# 1    70
# Name: 2, dtype: int64

In pandas.Series WIRD der angegebene Wert als Bezeichnung und nicht als Index betrachtet.

Use you at oder iat, um eindeutig anzugeben, ob es sich um ein Label oder einen Index handelt.

print(s.at[0])
# 40

print(s.iat[0])
# 10

Beachten Sie, dass, wenn SIE [-1] angeben, dies als Label mit dem Namen -1 betrachtet WIRD, nicht als Ende. Sie können iat verwenden.

# print(s[-1])
# KeyError: -1

print(s.iat[-1])
# 70

Daher ist es besser, at, iat, loc oder iloc zu verwenden, wenn der Zeilen- oder Spaltenname eine Ganzzahl ist.