Cet article explique comment parcourir un ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ avec une boucle ๐โ๐จโ๐ซโ .
Lorsque vous effectuez simplement une itรฉration sur un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ , il renvoie les noms des colonnes ; Cependant, vous pouvez parcourir ses colonnes ou ses lignes ร l’aide de mรฉthodes telles que ๐ขโ๐ญโ๐โ๐ฆโ๐ฌโ() (anciennement ๐ขโ๐ญโ๐โ๐ซโ๐ขโ๐ญโ๐โ๐ฆโ๐ฌโ() ), . .
La derniรจre partie de cet article aborde รฉgalement les approches permettant de traiter un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ sans boucle ๐โ๐จโ๐ซโ .
- Itรฉrer sur un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ
- Itรฉrer sur les colonnes d’un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ : ๐ขโ๐ญโ๐โ๐ฆโ๐ฌโ()๏ผanciennement ๐ขโ๐ญโ๐โ๐ซโ๐ขโ๐ญโ๐โ๐ฆโ๐ฌโ()๏ผ
- Itรฉrer sur les lignes d’un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ : ๐ขโ๐ญโ๐โ๐ซโ๐ซโ๐จโ๐ฐโ๐ฌโ() , ๐ขโ๐ญโ๐โ๐ซโ๐ญโ๐ฎโ๐ฉโ๐ฅโ๐โ๐ฌโ()
- Itรฉrer sur une colonne spรฉcifique (= S๐โ๐ซโ๐ขโ๐โ๐ฌโ ) d’un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ
- Mettre ร jour les valeurs dans une boucle ๐โ๐จโ๐ซโ
- Traiter un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ sans boucle ๐โ๐จโ๐ซโ
- Comparaison de la vitesse de traitement
Pour plus de dรฉtails sur les boucles ๐โ๐จโ๐ซโ en Python, consultez l’article suivant.
La version pandas utilisรฉe dans cet article est la suivante. Notez que les fonctionnalitรฉs peuvent varier selon les versions. Le D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ suivant est utilisรฉ comme exemple.
import pandas as pd print(pd.__version__) # 2.1.4 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
Itรฉrer sur un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ
L’itรฉration directe sur un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ avec une boucle ๐โ๐จโ๐ซโ extrait les noms de colonnes de maniรจre sรฉquentielle.
for column_name in df: print(column_name) # age # state # point
Itรฉrer sur les colonnes d’un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ : ๐ขโ๐ญโ๐โ๐ฆโ๐ฌโ()๏ผanciennement ๐ขโ๐ญโ๐โ๐ซโ๐ขโ๐ญโ๐โ๐ฆโ๐ฌโ()๏ผ
La mรฉthode ๐ขโ๐ญโ๐โ๐ฆโ๐ฌโ() itรจre sur les colonnes d’un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ sous forme de paires (๐โ๐จโ๐ฅโ๐ฎโ๐ฆโ๐งโ_๐งโ๐โ๐ฆโ๐โ, S๐โ๐ซโ๐ขโ๐โ๐ฌ) .
Vous pouvez extraire chaque valeur en spรฉcifiant l’รฉtiquette dans le S๐โ๐ซโ๐ขโ๐โ๐ฌโ .
for column_name, item in df.items(): print(column_name) print(type(item)) print(item['Alice'], item['Bob']) print('======') # age # <class 'pandas.core.series.Series'> # 24 42 # ====== # state # <class 'pandas.core.series.Series'> # NY CA # ====== # point # <class 'pandas.core.series.Series'> # 64 92 # ======
Notez que cette mรฉthode รฉtait auparavant nommรฉe ๐ขโ๐ญโ๐โ๐ซโ๐ขโ๐ญโ๐โ๐ฆโ๐ฌโ() , mais elle a รฉtรฉ modifiรฉe en ๐ขโ๐ญโ๐โ๐ฆโ๐ฌโ() . ๐ขโ๐ญโ๐โ๐ซโ๐ขโ๐ญโ๐โ๐ฆโ๐ฌโ() a รฉtรฉ supprimรฉ dans la version 2.0 de pandas.
- Nouveautรฉs de la version 2.0.0 (3 avril 2023) โ Documentation de pandas 2.1.4
- DEPR : Series/DataFrame/HDFStore.iteritems() par mroeschke ยท Pull Request #45321 ยท pandas-dev/pandas
Itรฉrer sur les lignes d’un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ : ๐ขโ๐ญโ๐โ๐ซโ๐ซโ๐จโ๐ฐโ๐ฌโ() , ๐ขโ๐ญโ๐โ๐ซโ๐ญโ๐ฎโ๐ฉโ๐ฅโ๐โ๐ฌโ()
Vous pouvez utiliser les mรฉthodes ๐ขโ๐ญโ๐โ๐ซโ๐ซโ๐จโ๐ฐโ๐ฌโ() et ๐ขโ๐ญโ๐โ๐ซโ๐ญโ๐ฎโ๐ฉโ๐ฅโ๐โ๐ฌโ() pour parcourir les lignes d’un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ . ๐ขโ๐ญโ๐โ๐ซโ๐ญโ๐ฎโ๐ฉโ๐ฅโ๐โ๐ฌโ() est plus rapide que ๐ขโ๐ญโ๐โ๐ซโ๐ซโ๐จโ๐ฐโ๐ฌโ() .
Si vous n’avez besoin que des valeurs d’une colonne spรฉcifique, il est encore plus rapide d’effectuer une itรฉration sur cette colonne individuellement, comme dรฉcrit ci-aprรจs. Les rรฉsultats d’une expรฉrience sur la vitesse de traitement sont prรฉsentรฉs ร la fin.
๐ข๐ฅ๐๐ฌ๐ญ๐๐ซ๐ซ๐จ๐ง๐ญ()
La mรฉthode ๐ขโ๐ญโ๐โ๐ซโ๐ซโ๐จโ๐ฐโ๐ฌโ() parcourt les lignes d’un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ sous forme de paires (๐ขโ๐งโ๐โ๐โ๐ฑโ, S๐โ๐ซโ๐ขโ๐โ๐ฌ) .
for index, row in df.iterrows(): print(index) print(type(row)) print(row['age'], row['state'], row['point']) print('======') # Alice # <class 'pandas.core.series.Series'> # 24 NY 64 # ====== # Bob # <class 'pandas.core.series.Series'> # 42 CA 92 # ======
๐ข๐ฅ๐๐ฌ๐ญ๐ข๐๐ง๐ญ ()
La mรฉthode ๐ขโ๐ญโ๐โ๐ซโ๐ญโ๐ฎโ๐ฉโ๐ฅโ๐โ๐ฌโ() parcourt les lignes d’un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ , renvoyant chacune sous la forme d’ un ๐งโ๐โ๐ฆโ๐โ๐โ๐ญโ๐ฎโ๐ฉโ๐ฅโ๐โ .
Par dรฉfaut, il renvoie une chaรฎne nommรฉe P๐โ๐งโ๐โ๐โ๐ฌโ , dont le premier รฉlรฉment reprรฉsente l’index (nom de la ligne). Vous pouvez ร chaque valeur avec [] et . .
for row in df.itertuples(): print(type(row)) print(row) print(row[0], row[1], row[2], row[3]) print(row.Index, row.age, row.state, row.point) print('======') # <class 'pandas.core.frame.Pandas'> # Pandas(Index='Alice', age=24, state='NY', point=64) # Alice 24 NY 64 # Alice 24 NY 64 # ====== # <class 'pandas.core.frame.Pandas'> # Pandas(Index='Bob', age=42, state='CA', point=92) # Bob 42 CA 92 # Bob 42 CA 92 # ======
La dรฉfinition de l’argument ๐ขโ๐งโ๐โ๐โ๐ฑโ sur F๐โ๐ฅโ๐ฌโ๐โ exclut l’index de ๐งโ๐โ๐ฆโ๐โ๐โ๐ญโ๐ฎโ๐ฉโ๐ฅโ๐โ . Vous pouvez รฉgalement prรฉciser le nom du ๐งโ๐โ๐ฆโ๐โ๐โ๐ญโ๐ฎโ๐ฉโ๐ฅโ๐โ avec l’argument ๐งโ๐โ๐ฆโ๐โ .
for row in df.itertuples(index=False, name='Person'): print(type(row)) print(row) print(row[0], row[1], row[2]) print(row.age, row.state, row.point) print('======') # <class 'pandas.core.frame.Person'> # Person(age=24, state='NY', point=64) # 24 NY 64 # 24 NY 64 # ====== # <class 'pandas.core.frame.Person'> # Person(age=42, state='CA', point=92) # 42 CA 92 # 42 CA 92 # ======
La dรฉfinition de l’argument ๐งโ๐โ๐ฆโ๐โ sur N๐จโ๐งโ๐โ renvoie une valeur normale ๐ญโ๐ฎโ๐ฉโ๐ฅโ๐โ .
for row in df.itertuples(name=None): print(type(row)) print(row) print(row[0], row[1], row[2], row[3]) print('======') # <class 'tuple'> # ('Alice', 24, 'NY', 64) # Alice 24 NY 64 # ====== # <class 'tuple'> # ('Bob', 42, 'CA', 92) # Bob 42 CA 92 # ======
Itรฉrer sur une colonne spรฉcifique (= S๐โ๐ซโ๐ขโ๐โ๐ฌโ ) d’un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ
Bien que les mรฉthodes ๐ขโ๐ญโ๐โ๐ซโ๐ซโ๐จโ๐ฐโ๐ฌโ() et ๐ขโ๐ญโ๐โ๐ซโ๐ญโ๐ฎโ๐ฉโ๐ฅโ๐โ๐ฌโ() gรฉnรจrent toutes les valeurs de chaque ligne, si vous n’avez besoin que des valeurs d’une colonne spรฉcifique, vous pouvez effectuer une itรฉration sur celle-ci.
Une colonne dans un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ est un S๐โ๐ซโ๐ขโ๐โ๐ฌโ .
print(df['age']) # Alice 24 # Bob 42 # Name: age, dtype: int64 print(type(df['age'])) # <class 'pandas.core.series.Series'>
รtant donnรฉ que l’itรฉration sur une colonne S gรฉnรจre ses valeurs, vous pouvez rรฉcupรฉrer sรฉquentiellement les valeurs de la colonne D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ en utilisant une boucle ๐โ๐จโ๐ซโ .
for age in df['age']: print(age) # 24 # 42
La fonction intรฉgrรฉe ๐ณโ๐ขโ๐ฉโ() peut รชtre utilisรฉe pour rรฉcupรฉrer des valeurs de plusieurs colonnes ensemble.
for age, point in zip(df['age'], df['point']): print(age, point) # 24 64 # 42 92
Pour rรฉcupรฉrer les noms de lignes, utilisez l’attribut ๐ขโ๐งโ๐โ๐โ๐ฑโ . Comme dans l’exemple ci-dessus, vous pouvez les rรฉcupรฉrer avec d’autres colonnes ร l’aide de ๐ณโ๐ขโ๐ฉโ() .
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
Mettre ร jour les valeurs dans une boucle ๐โ๐จโ๐ซโ
Le S๐โ๐ซโ๐ขโ๐โ๐ฌโ renvoyรฉ par ๐ขโ๐ญโ๐โ๐ซโ๐ซโ๐จโ๐ฐโ๐ฌโ() peut รชtre une copie, pas une vue, donc le modifier peut ne pas mettre ร jour les donnรฉes d’origine.
print(df) # age state point # Alice 24 NY 64 # Bob 42 CA 92 for index, row in df.iterrows(): row['point'] += row['age'] print(df) # age state point # Alice 24 NY 64 # Bob 42 CA 92
Vous pouvez mettre ร jour les valeurs en sรฉlectionnant un รฉlรฉment du D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ d’origine avec ๐โ๐ญโ[] .
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
Bien que l’exemple prรฉcรฉdent montre l’utilisation de ๐โ๐ญโ[] pour mettre ร jour des valeurs, il est important de noter que dans de nombreuses situations, une boucle ๐โ๐จโ๐ซโ est inutile pour de telles mises ร jour. Souvent, les mรฉthodes alternatives sont non seulement plus simples mais aussi plus efficaces. La section suivante prรฉsente des exemples spรฉcifiques de ces alternatives.
Traiter un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ sans boucle ๐โ๐จโ๐ซโ
L’opรฉration dรฉmontrรฉe dans la section prรฉcรฉdente avec une boucle ๐โ๐จโ๐ซโ peut รฉgalement รชtre rรฉalisรฉe sans boucle ๐โ๐จโ๐ซโ comme suit.
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 df['point'] += df['age'] print(df) # age state point # Alice 24 NY 88 # Bob 42 CA 134
Il est รฉgalement possible de traiter les colonnes existantes et de les ajouter en tant que nouvelles colonnes.
df['new'] = df['point'] + df['age'] * 2 + 1000 print(df) # age state point new # Alice 24 NY 88 1136 # Bob 42 CA 134 1218
En plus des opรฉrations arithmรฉtiques utilisant des opรฉrateurs comme + et * , vous pouvez appliquer des fonctions NumPy ร chaque รฉlรฉment d’une colonne.
import numpy as np df['age_sqrt'] = np.sqrt(df['age']) print(df) # age state point new age_sqrt # Alice 24 NY 88 1136 4.898979 # Bob 42 CA 134 1218 6.480741
Pour le traitement des chaรฎnes, pandas propose des mรฉthodes spรฉcifiques pour gรฉrer directement les colonnes ( S๐โ๐ซโ๐ขโ๐โ๐ฌโ ).
- pandas : gรฉrer les chaรฎnes (remplacer, supprimer, conversion de casse, etc.)
- pandas : dรฉcouper les sous-chaรฎnes de chaque รฉlรฉment en colonnes
df['state_0'] = df['state'].str.lower().str[0] print(df) # age state point new age_sqrt state_0 # Alice 24 NY 88 1136 4.898979 n # Bob 42 CA 134 1218 6.480741 c
De plus, vous pouvez appliquer n’importe quelle fonction ร chaque รฉlรฉment ou ร chaque ligne/colonne en utilisant les mรฉthodes ๐ฆโ๐โ๐ฉโ() et ๐โ๐ฉโ๐ฉโ๐ฅโ๐ฒโ() .
df['point_hex'] = df['point'].map(hex) print(df) # age state point new age_sqrt state_0 point_hex # Alice 24 NY 88 1136 4.898979 n 0x58 # Bob 42 CA 134 1218 6.480741 c 0x86
Comparaison de la vitesse de traitement
Cette section compare les vitesses de traitement des mรฉthodes telles que ๐ขโ๐ญโ๐โ๐ซโ๐ซโ๐จโ๐ฐโ๐ฌโ() , ๐ขโ๐ญโ๐โ๐ซโ๐ญโ๐ฎโ๐ฉโ๐ฅโ๐โ๐ฌโ() et les boucles ๐โ๐จโ๐ซโ spรฉcifiques aux colonnes .
Considรฉrez le D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ suivant avec 100 lignes et 10 colonnes.
- numpy.arange(), linspace() : gรฉnรฉrer un ndarray avec des valeurs identiques espacรฉes
- pandas : obtenir les n premiรจres/derniรจres lignes du DataFrame avec head() et tail()
import pandas as pd import numpy as np df = pd.DataFrame(np.arange(1000).reshape(100, 10)) print(df.shape) # (100, 10) print(df.head(3)) # 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 print(df.tail(3)) # 0 1 2 3 4 5 6 7 8 9 # 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
Le code suivant a รฉtรฉ mesurรฉ ร l’aide de la commande magique %%๐ญโ๐ขโ๐ฆโ๐โ๐ขโ๐ญโ dans Jupyter Notebook. Notez qu’il n’est pas mesurรฉ s’il est exรฉcutรฉ en tant que script Python.
%%timeit for i, row in df.iterrows(): pass # 735 ยตs ยฑ 20.5 ยตs per loop (mean ยฑ std. dev. of 7 runs, 1,000 loops each) %%timeit for t in df.itertuples(): pass # 202 ยตs ยฑ 1.74 ยตs per loop (mean ยฑ std. dev. of 7 runs, 1,000 loops each) %%timeit for t in df.itertuples(name=None): pass # 148 ยตs ยฑ 780 ns per loop (mean ยฑ std. dev. of 7 runs, 10,000 loops each) %%timeit for i in df[0]: pass # 4.27 ยตs ยฑ 30.3 ns per loop (mean ยฑ std. dev. of 7 runs, 100,000 loops each) %%timeit for i, j, k in zip(df[0], df[4], df[9]): pass # 13.5 ยตs ยฑ 53.4 ns per loop (mean ยฑ std. dev. of 7 runs, 100,000 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 # 41.3 ยตs ยฑ 281 ns per loop (mean ยฑ std. dev. of 7 runs, 10,000 loops each)
๐ขโ๐ญโ๐โ๐ซโ๐ซโ๐จโ๐ฐโ๐ฌโ() a tendance ร รชtre assez lente, car elle convertit chaque ligne en un S๐โ๐ซโ๐ขโ๐โ๐ฌโ , alors que ๐ขโ๐ญโ๐โ๐ซโ๐ญโ๐ฎโ๐ฉโ๐ฅโ๐โ๐ฌโ() est plus rapide. Cependant, les colonnes pour l’itรฉration sont dรฉfinies comme la mรฉthode la plus rapide. Dans notre environnement d’exemple, l’itรฉration spรฉcifique ร la colonne s’est avรฉrรฉe plus rapide que ๐ขโ๐ญโ๐โ๐ซโ๐ญโ๐ฎโ๐ฉโ๐ฅโ๐โ๐ฌโ() , mรชme lors de l’extraction de toutes les colonnes.
Bien que la diffรฉrence de vitesse ne soit pas significative pour les ensembles de donnรฉes contenant environ 100 lignes, ๐ขโ๐ญโ๐โ๐ซโ๐ซโ๐จโ๐ฐโ๐ฌโ() ralentit considรฉrablement avec les ensembles de donnรฉes plus volumineux. Dans de tels cas, il est conseillรฉ d’utiliser ๐ขโ๐ญโ๐โ๐ซโ๐ญโ๐ฎโ๐ฉโ๐ฅโ๐โ๐ฌโ() ou une itรฉration spรฉcifique ร la colonne.
Comme mentionnรฉ prรฉcรฉdemment, l’approche la plus efficace consiste souvent ร effectuer des opรฉrations sans boucles .
