Skip to content

pandas: DataFrame mit „for“-Schleife iterieren

Python

Wenn pandas.DataFrame einheitlich von der For-Schleife durchlaufen wird, werden Spaltennamen zurückgegeben. Sie können Spalten und Zeilen von pandas.DataFrame mit den Methoden iteritems(), iterrows() und itertuples() durchlaufen.

Dieser Artikel hat folgenden Inhalt.

  • pandas.DataFrame einfach in for-Schleife durchlaufen
  • Spalten von pandas.DataFrame iterieren
  • Iterieren Sie Zeilen von pandas.DataFrame
    • DataFrame.iterrows()
    • DataFrame.itertuples()
  • Nur bestimmte Spalten iterieren
  • Aktualisieren Sie die Werte in der For-Schleife
  • Geschwindigkeitsvergleich

Weitere Informationen zur for-Anweisung in Python finden Sie im following Artikel.

Verwenden Sie den following pandas.DataFrame als Beispiel.

import pandas as pd
import numpy as np

df = pd.DataFrame({'age': [24, 42], 'state': ['NY', 'CA'], 'point': [64, 92]},
                  index=['Alice', 'Bob'])

print(df)
#        age state  point
# Alice   24    NY     64
# Bob     42    CA     92

pandas.DataFrame einfach in for-Schleife durchlaufen

Wenn Sie pandas.DataFrame in einer for-Schleife durchlaufen, werden die Spaltennamen der Reihe nach zurückgegeben.

for column_name in df:
    print(column_name)
# age
# state
# point

Spalten von pandas.DataFrame iterieren

DataFrame.iteritems()

Die Methode iteritems() iteriert über Spalten und gibt (Spaltenname, Serie) ein Tupel mit dem Spaltennamen und dem Inhalt als pandas.Series zurück.

for column_name, item in df.iteritems():
    print(column_name)
    print('------')
    print(type(item))
    print(item)
    print('------')
    print(item[0], item['Alice'], item.Alice)
    print(item[1], item['Bob'], item.Bob)
    print('======n')
# age
# ------
# <class 'pandas.core.series.Series'>
# Alice    24
# Bob      42
# Name: age, dtype: int64
# ------
# 24 24 24
# 42 42 42
# ======
# 
# state
# ------
# <class 'pandas.core.series.Series'>
# Alice    NY
# Bob      CA
# Name: state, dtype: object
# ------
# NY NY NY
# CA CA CA
# ======
# 
# point
# ------
# <class 'pandas.core.series.Series'>
# Alice    64
# Bob      92
# Name: point, dtype: int64
# ------
# 64 64 64
# 92 92 92
# ======
# 

Iterieren Sie Zeilen von pandas.DataFrame

Die Methoden iterrows() und itertuples() iterieren über Zeilen. Die Methode itertuples() ist schneller.

If SIE Nur sterben Werte für Eine bestimmte Spalte benötigen, IST ES NOCH SCHNELLER, sterben Elemente Einer bestimmten Spalte einzeln zu durchlaufen, wie im Folgenden erläutert WIRD. Die Ergebnisse des Geschwindigkeitsvergleichs werden am Ende angezeigt.

DataFrame.iterrows()

Die Methode iterrows() iteriert über Zeilen und gibt (index, Series) zurück, ein Tupel mit dem Index und dem Inhalt als pandas.Series.

for index, row in df.iterrows():
    print(index)
    print('------')
    print(type(row))
    print(row)
    print('------')
    print(row[0], row['age'], row.age)
    print(row[1], row['state'], row.state)
    print(row[2], row['point'], row.point)
    print('======n')
# Alice
# ------
# <class 'pandas.core.series.Series'>
# age      24
# state    NY
# point    64
# Name: Alice, dtype: object
# ------
# 24 24 24
# NY NY NY
# 64 64 64
# ======
# 
# Bob
# ------
# <class 'pandas.core.series.Series'>
# age      42
# state    CA
# point    92
# Name: Bob, dtype: object
# ------
# 42 42 42
# CA CA CA
# 92 92 92
# ======
# 

DataFrame.itertuples()

Die Methode itertuples() iteriert über Zeilen und gibt ein Tupel aus dem Index und dem Inhalt zurück. Das erste Element des Tupels ist der Index.

Standardmäßig gibt es ein benanntes Tupel namens Pandas zurück. Da es sich um ein benanntes Tupel handelt, können Sie mit auf den Wert jedes Elements zugreifen. ebenso gut wie [].

for row in df.itertuples():
    print(type(row))
    print(row)
    print('------')
    print(row[0], row.Index)
    print(row[1], row.age)
    print(row[2], row.state)
    print(row[3], row.point)
    print('======n')
# <class 'pandas.core.frame.Pandas'>
# Pandas(Index='Alice', age=24, state="NY", point=64)
# ------
# Alice Alice
# 24 24
# NY NY
# 64 64
# ======
# 
# <class 'pandas.core.frame.Pandas'>
# Pandas(Index='Bob', age=42, state="CA", point=92)
# ------
# Bob Bob
# 42 42
# CA CA
# 92 92
# ======
# 

Ein normales Tupel wird zurückgegeben, wenn der Name-Parameter auf None gesetzt ist.

for row in df.itertuples(name=None):
    print(type(row))
    print(row)
    print(row[0], row[1], row[2], row[3])
    print('======n')
# <class 'tuple'>
# ('Alice', 24, 'NY', 64)
# Alice 24 NY 64
# ======
# 
# <class 'tuple'>
# ('Bob', 42, 'CA', 92)
# Bob 42 CA 92
# ======
# 

Nur bestimmte Spalten iterieren

Wenn Sie nur die Elemente einer bestimmten Spalte benötigen, können Sie auch wie folgt schreiben.

Die pandas.DataFrame-Spalte ist pandas.Series.

print(df['age'])
# Alice    24
# Bob      42
# Name: age, dtype: int64

print(type(df['age']))
# <class 'pandas.core.series.Series'>

Wenn Sie pandas.Series auf eine For-Schleife anwenden, können Sie ihre Werte ordnen. SIE can die Werte dieser Spalte ordnen, indem Sie eine pandas.DataFrame-Spalte angeben und sie auf eine for-Schleife anwenden.

for age in df['age']:
    print(age)
# 24
# 42

Sie können auch die Werte mehrerer Spalten mit der integrierten Funktion zip() abrufen.

for age, point in zip(df['age'], df['point']):
    print(age, point)
# 24 64
# 42 92

Verwenden Sie das Index-Attribut, wenn Sie den Index abrufen möchten. Wie im obigen Beispiel can SIE es mit anderen Spalten per zip() zusammenbringen.

print(df.index)
# Index(['Alice', 'Bob'], dtype="object")

print(type(df.index))
# <class 'pandas.core.indexes.base.Index'>

for index in df.index:
    print(index)
# Alice
# Bob

for index, state in zip(df.index, df['state']):
    print(index, state)
# Alice NY
# Bob CA

Aktualisieren Sie die Werte in der For-Schleife

Die von der iterrows()-Methode zurückgegebene pandas.Series ist eine Kopie, keine Ansicht, daher werden die Daten ursprünglich nicht aktualisiert, wenn sie geändert wird.

for index, row in df.iterrows():
    row['point'] += row['age']

print(df)
#        age state  point
# Alice   24    NY     64
# Bob     42    CA     92

Sie können es aktualisieren, indem Sie Elemente des ursprünglichen DataFrame mit at[] auswählen.

for index, row in df.iterrows():
    df.at[index, 'point'] += row['age']

print(df)
#        age state  point
# Alice   24    NY     88
# Bob     42    CA    134

Siehe den folgenden Artikel auf at[].

In vielen Fällen ist es jedoch nicht erforderlich, eine for-Schleife zu verwenden, um ein Element zu aktualisieren oder eine neue Spalte basierend auf einer vorhandenen Spalte hinzuzufügen. Es ist und einfacher, ohne for-Schleife zu schreiben.

Gleicher Vorgang ohne for-Schleife:

df = pd.DataFrame({'age': [24, 42], 'state': ['NY', 'CA'], 'point': [64, 92]},
                  index=['Alice', 'Bob'])
df['point'] += df['age']
print(df)
#        age state  point
# Alice   24    NY     88
# Bob     42    CA    134

Sie können eine neue Spalte hinzufügen.

df['new'] = df['point'] + df['age'] * 2
print(df)
#        age state  point  new
# Alice   24    NY     88  136
# Bob     42    CA    134  218

Sie können auch NumPy-Funktionen auf jedes Element einer Spalte anwenden.

df['age_sqrt'] = np.sqrt(df['age'])
print(df)
#        age state  point  new  age_sqrt
# Alice   24    NY     88  136  4.898979
# Bob     42    CA    134  218  6.480741

Für Strings werden verschiedene Methoden bereitgestellt, um die Spalten direkt zu verarbeiten. Im Folgenden finden Sie ein Beispiel für die Umwandlung in Kleinbuchstaben und die Auswahl des ersten Zeichens.

df['state_0'] = df['state'].str.lower().str[0]
print(df)
#        age state  point  new  age_sqrt state_0
# Alice   24    NY     88  136  4.898979       n
# Bob     42    CA    134  218  6.480741       c

Geschwindigkeitsvergleich

Vergleichen Sie die Geschwindigkeit von iterrows(), itertuples() und die Methode zur Angabe von Spalten.

Verwenden Sie pandas.DataFrame mit 100 Zeilen und 10 Spalten als Beispiel. Es ist ein einfaches Beispiel mit nur numerischen Elementen, Zeilennamenindex und Spaltennamenspalten sind standardmäßige fortlaufende Nummern.

import pandas as pd

df = pd.DataFrame(pd.np.arange(1000).reshape(100, 10))
print(df.shape)
# (100, 10)

print(df.head())
#     0   1   2   3   4   5   6   7   8   9
# 0   0   1   2   3   4   5   6   7   8   9
# 1  10  11  12  13  14  15  16  17  18  19
# 2  20  21  22  23  24  25  26  27  28  29
# 3  30  31  32  33  34  35  36  37  38  39
# 4  40  41  42  43  44  45  46  47  48  49

print(df.tail())
#       0    1    2    3    4    5    6    7    8    9
# 95  950  951  952  953  954  955  956  957  958  959
# 96  960  961  962  963  964  965  966  967  968  969
# 97  970  971  972  973  974  975  976  977  978  979
# 98  980  981  982  983  984  985  986  987  988  989
# 99  990  991  992  993  994  995  996  997  998  999

Beachten Sie, dass der folgende Code den magischen Jupyter Notebook-Befehl %%timeit used und nicht funktioniert, wenn er als Python-Skript ausgeführt WIRD.

%%timeit
for i, row in df.iterrows():
    pass
# 4.53 ms ± 325 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit
for t in df.itertuples():
    pass
# 981 µs ± 43.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit
for t in df.itertuples(name=None):
    pass
# 718 µs ± 10.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit
for i in df[0]:
    pass
# 15.6 µs ± 446 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%%timeit
for i, j, k in zip(df[0], df[4], df[9]):
    pass
# 46.1 µs ± 588 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%%timeit
for t in zip(df[0], df[1], df[2], df[3], df[4], df[5], df[6], df[7], df[8], df[9]):
    pass
# 147 µs ± 3.78 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

iterrows() ist langsam, weil es jede Zeile in pandas.Series konvertiert.

itertuples() ist schneller als iterrows(), aber die Methode zur Angabe von Spalten ist die schnellste. In der Beispielumgebung ist es schneller als itertuples(), selbst wenn alle Spalten angegeben sind.

Wenn die Anzahl der Zeilen zunimmt, wird iterrows() noch langsamer. In einem solchen Fall sollten Sie versuchen, itertuples() oder die Spaltenspezifikation zu verwenden.

Wie oben erwähnt, ist es natürlich am besten, die for-Schleife nicht zu verwenden, wenn dies nicht erforderlich ist.