
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.