Skip to content

Dans pandas, vous pouvez utiliser les mรฉthodes ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() , ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ() et ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() pour appliquer des fonctions aux valeurs (รฉlรฉment par รฉlรฉment), aux lignes ou aux colonnes dans D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ๐ฌโ€Œ et S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ .

Contenu

Comme mentionnรฉ plus tard, D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ et S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ incluent dรฉjร  des mรฉthodes pour les opรฉrations courantes. De plus, vous pouvez appliquer des fonctions NumPy ร  D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ et S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ . L’utilisation de mรฉthodes dรฉdiรฉes ou de fonctions NumPy est prรฉfรฉrable ร  ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() ou ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ() en raison de meilleures performances.

Les versions de pandas et de NumPy utilisรฉes dans cet article sont les suivantes. Notez que les fonctionnalitรฉs peuvent varier selon les versions.

import pandas as pd import numpy as np print(pd.__version__) # 2.1.2 print(np.__version__) # 1.26.1 

Appliquer des fonctions aux valeurs dans S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ : ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() , ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ()

Pour appliquer une fonction ร  chaque valeur d’un S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ (รฉlรฉment par รฉlรฉment), utilisez les mรฉthodes ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() ou ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ() .

Comment utiliser ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ()

Le passage d’une fonction ร  ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() renvoie un nouveau S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ , avec la fonction appliquรฉe ร  chaque valeur. Par exemple, appliquez la fonction intรฉgrรฉe ๐กโ€Œ๐žโ€Œ๐ฑโ€Œ() pour convertir des entiers en chaรฎnes hexadรฉcimales.

s = pd.Series([1, 10, 100]) print(s) # 0 1 # 1 10 # 2 100 # dtype: int64 print(s.map(hex)) # 0 0x1 # 1 0xa # 2 0x64 # dtype: object 

Vous pouvez รฉgalement appliquer des fonctions dรฉfinies avec des expressions ๐โ€Œ๐žโ€Œ๐Ÿโ€Œ ou lambda.

def my_func(x): return x * 10 print(s.map(my_func)) # 0 10 # 1 100 # 2 1000 # dtype: int64 print(s.map(lambda x: x * 10)) # 0 10 # 1 100 # 2 1000 # dtype: int64 

L’exemple ci-dessus est fourni ร  titre illustratif ; des opรฉrations arithmรฉtiques simples peuvent รชtre effectuรฉes directement sur un S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ .

print(s * 10) # 0 10 # 1 100 # 2 1000 # dtype: int64 

Par dรฉfaut, les valeurs manquantes ( N๐šโ€ŒN ) sont transmises ร  la fonction, mais si vous dรฉfinissez le deuxiรจme argument ๐งโ€Œ๐šโ€Œ_๐šโ€Œ๐œโ€Œ๐ญโ€Œ๐ขโ€Œ๐จโ€Œ๐งโ€Œ sur ‘๐ขโ€Œ๐ โ€Œ๐งโ€Œ๐จโ€Œ๐ซโ€Œ๐žโ€Œ’ , N๐šโ€ŒN ne sera pas transmis ร  la fonction et le rรฉsultat restera N๐šโ€ŒN .

ร‰tant donnรฉ que la prรฉsence de N๐šโ€ŒN modifie le type de donnรฉes ( ๐โ€Œ๐ญโ€Œ๐ฒโ€Œ๐ฉโ€Œ๐žโ€Œ ) en un nombre ร  virgule flottante ( ๐Ÿโ€Œ๐ฅโ€Œ๐จโ€Œ๐šโ€Œ๐ญโ€Œ ), les valeurs sont converties en entiers ( ๐ขโ€Œ๐งโ€Œ๐ญโ€Œ ) ร  l’aide de ๐ขโ€Œ๐งโ€Œ๐ญโ€Œ() avant d’รชtre passรฉ ร  ๐กโ€Œ๐žโ€Œ๐ฑโ€Œ() dans l’exemple suivant.

s_nan = pd.Series([1, float('nan'), 100]) print(s_nan) # 0 1.0 # 1 NaN # 2 100.0 # dtype: float64 # print(s_nan.map(lambda x: hex(int(x)))) # ValueError: cannot convert float NaN to integer print(s_nan.map(lambda x: hex(int(x)), na_action='ignore')) # 0 0x1 # 1 NaN # 2 0x64 # dtype: object 

Vous pouvez รฉgalement passer un dictionnaire ( ๐โ€Œ๐ขโ€Œ๐œโ€Œ๐ญโ€Œ ) ร  ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() . Dans ce cas, il remplace les valeurs. Pour plus de dรฉtails, reportez-vous ร  l’article suivant.

Comment utiliser ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ()

Similairement ร  ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() , la fonction spรฉcifiรฉe comme premier argument dans ๐šโ€Œ๐ฉโ€Œ๐ฉ๐ฅโ€Œ๐ฒโ€Œ() est appliquรฉe ร  chaque valeur. La diffรฉrence est que ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ() vous permet de prรฉciser des arguments ร  transmettre ร  la fonction.

Avec ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() , vous devez utiliser une expression lambda ou une approche similaire pour transmettre des arguments ร  la fonction. Par exemple, spรฉcifiez l’argument ๐›โ€Œ๐šโ€Œ๐ฌโ€Œ๐žโ€Œ dans la fonction ๐ขโ€Œ๐งโ€Œ๐ญโ€Œ() , qui convertit les chaรฎnes en entiers.

s = pd.Series(['11', 'AA', 'FF']) print(s) # 0 11 # 1 AA # 2 FF # dtype: object # print(s.map(int, base=16)) # TypeError: Series.map() got an unexpected keyword argument 'base' print(s.map(lambda x: int(x, 16))) # 0 17 # 1 170 # 2 255 # dtype: int64 

Avec ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ() , tous les arguments de mot-clรฉ spรฉcifiรฉs sont transmis directement ร  la fonction. Il est รฉgalement possible de prรฉciser des arguments positionnels ร  l’aide de l’argument ๐šโ€Œ๐ซโ€Œ๐ โ€Œ๐ฌโ€Œ .

print(s.apply(int, base=16)) # 0 17 # 1 170 # 2 255 # dtype: int64 print(s.apply(int, args=(16,))) # 0 17 # 1 170 # 2 255 # dtype: int64 

Notez que mรชme s’il n’y a qu’un seul argument positionnel, il doit รชtre spรฉcifiรฉ sous forme de tuple ou de liste dans l’argument ๐šโ€Œ๐ซโ€Œ๐ โ€Œ๐ฌโ€Œ . Une virgule est nรฉcessaire ร  la fin d’un tuple ร  un รฉlรฉment.

ร€ partir de la version 2.1.2, ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ() n’a pas l’argument ๐งโ€Œ๐šโ€Œ_๐šโ€Œ๐œโ€Œ๐ญโ€Œ๐ขโ€Œ๐จโ€Œ๐งโ€Œ .

Appliquer des fonctions aux valeurs dans D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ : ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() , ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ()

Pour appliquer une fonction ร  chaque valeur d’un D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ (รฉlรฉment par รฉlรฉment), utilisez les mรฉthodes ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() ou ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() .

Depuis la version 2.1.0, ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() a รฉtรฉ renommรฉ en ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() et marquรฉ comme obsolรจte.

ร€ partir de la version 2.1.2, ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() est toujours utilisable mais gรฉnรจre un F๐ฎโ€Œ๐ญโ€Œ๐ฎโ€Œ๐ซโ€Œ๐žโ€ŒW๐šโ€Œ๐ซโ€Œ๐งโ€Œ๐ขโ€Œ๐งโ€Œ๐ โ€Œ .

df = pd.DataFrame([[1, 10, 100], [2, 20, 200]]) print(df) # 0 1 2 # 0 1 10 100 # 1 2 20 200 print(df.map(hex)) # 0 1 2 # 0 0x1 0xa 0x64 # 1 0x2 0x14 0xc8 print(df.applymap(hex)) # 0 1 2 # 0 0x1 0xa 0x64 # 1 0x2 0x14 0xc8 #  # /var/folders/rf/b7l8_vgj5mdgvghn_326rn_c0000gn/T/ipykernel_36685/2076800564.py:1: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead. 

L’exemple suivant utilise ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() , mais ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() a la mรชme utilisation et les mรชmes fonctionnalitรฉs. Dans les versions antรฉrieures ร  2.1.0, utilisez ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() .

Comme avec ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() de S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ , l’argument ๐งโ€Œ๐šโ€Œ_๐šโ€Œ๐œโ€Œ๐ญโ€Œ๐ขโ€Œ๐จโ€Œ๐งโ€Œ peut รชtre spรฉcifiรฉ pour ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() de D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ . Par dรฉfaut, les valeurs manquantes ( N๐šโ€ŒN ) sont transmises ร  la fonction, mais si ๐งโ€Œ๐šโ€Œ_๐šโ€Œ๐œโ€Œ๐ญโ€Œ๐ขโ€Œ๐จโ€Œ๐งโ€Œ est dรฉfinie sur ‘๐ขโ€Œ๐ โ€Œ๐งโ€Œ๐จโ€Œ๐ซโ€Œ๐žโ€Œ’ , N๐šโ€ŒN n’est pas transmis ร  la fonction et le rรฉsultat reste N๐šโ€ŒN .

df_nan = pd.DataFrame([[1, float('nan'), 100], [2, 20, 200]]) print(df_nan) # 0 1 2 # 0 1 NaN 100 # 1 2 20.0 200 # print(df_nan.map(lambda x: hex(int(x)))) # ValueError: cannot convert float NaN to integer print(df_nan.map(lambda x: hex(int(x)), na_action='ignore')) # 0 1 2 # 0 0x1 NaN 0x64 # 1 0x2 0x14 0xc8 

Contrairement ร  ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() de S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ , ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() de D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ transmet l’argument mot-clรฉ spรฉcifiรฉ ร  la fonction.

df = pd.DataFrame([['1', 'A', 'F'], ['11', 'AA', 'FF']]) print(df) # 0 1 2 # 0 1 A F # 1 11 AA FF print(df.map(int, base=16)) # 0 1 2 # 0 1 10 15 # 1 17 170 255 

ร€ partir de la version 2.1.2, ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() de D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ n’a pas l’argument ๐šโ€Œ๐ซโ€Œ๐ โ€Œ๐ฌโ€Œ , ce qui signifie que vous ne pouvez pas dรฉfinir d’arguments positionnels.

Appliquer des fonctions aux lignes et aux colonnes dans D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ : ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ()

Pour appliquer une fonction aux lignes ou aux colonnes d’un D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ , utilisez la mรฉthode ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ() .

Pour la mรฉthode ๐šโ€Œ๐ โ€Œ๐ โ€Œ() appliquer plusieurs opรฉrations ร  la fois, consultez l’article suivant.

Utilisation de la base

Spรฉcifiez la fonction que vous souhaitez appliquer comme premier argument.

Notez que la fonction ๐ฌโ€Œ๐ฎโ€Œ๐ฆโ€Œ() intรฉgrรฉe est utilisรฉe ร  des fins d’explication, mais si vous devez calculer une somme, il est prรฉfรฉrable d’utiliser la mรฉthode ๐ฌโ€Œ๐ฎโ€Œ๐ฆโ€Œ() mentionnรฉe plus tard.

df = pd.DataFrame([[10, 20, 30], [40, 50, 60]], index=['X', 'Y'], columns=['A', 'B', 'C']) print(df) # A B C # X 10 20 30 # Y 40 50 60 print(df.apply(sum)) # A 50 # B 70 # C 90 # dtype: int64 

Par dรฉfaut, chaque colonne est transmise ร  la fonction sous la forme d’un S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ . Si la fonction ne peut pas accepter un S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ comme argument, une erreur se produit.

print(df.apply(lambda x: type(x))) # A <class 'pandas.core.series.Series'> # B <class 'pandas.core.series.Series'> # C <class 'pandas.core.series.Series'> # dtype: object # print(hex(df['A'])) # TypeError: 'Series' object cannot be interpreted as an integer # print(df.apply(hex)) # TypeError: 'Series' object cannot be interpreted as an integer 

Spรฉcifiez les lignes ou les colonnes : ๐šโ€Œ๐ฑโ€Œ๐ขโ€Œ๐ฌโ€Œ

Par dรฉfaut, la fonction est appliquรฉe ร  chaque colonne. Cependant, si vous dรฉfinissez l’argument ๐šโ€Œ๐ฑโ€Œ๐ขโ€Œ๐ฌโ€Œ sur 1 ou ‘๐œโ€Œ๐จโ€Œ๐ฅโ€Œ๐ฎโ€Œ๐ฆโ€Œ๐งโ€Œ๐ฌโ€Œ’, l’applique ร  chaque ligne.

df = pd.DataFrame([[10, 20, 30], [40, 50, 60]], index=['X', 'Y'], columns=['A', 'B', 'C']) print(df) # A B C # X 10 20 30 # Y 40 50 60 print(df.apply(sum, axis=1)) # X 60 # Y 150 # dtype: int64 

Spรฉcifiez les arguments de la fonction : arguments par mot-clรฉ, ๐šโ€Œ๐ซโ€Œ๐ โ€Œ๐ฌโ€Œ

Tous les arguments de mot-clรฉ spรฉcifiรฉs dans ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ() sont transmis ร  la fonction en cours d’application. Vous pouvez รฉgalement prรฉciser des arguments positionnels ร  l’aide de l’argument ๐šโ€Œ๐ซโ€Œ๐ โ€Œ๐ฌโ€Œ .

df = pd.DataFrame([[10, 20, 30], [40, 50, 60]], index=['X', 'Y'], columns=['A', 'B', 'C']) print(df) # A B C # X 10 20 30 # Y 40 50 60 def my_func(x, y, z): return sum(x) + y + z * 2 print(df.apply(my_func, y=100, z=1000)) # A 2150 # B 2170 # C 2190 # dtype: int64 print(df.apply(my_func, args=(100, 1000))) # A 2150 # B 2170 # C 2190 # dtype: int64 

Passer pour ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ซโ€Œ๐ซโ€Œ๐šโ€Œ๐ฒโ€Œ au lieu de S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ : ๐ซโ€Œ๐šโ€Œ๐ฐโ€Œ

Par dรฉfaut, chaque ligne ou colonne est transmise sous forme de S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ . Si vous dรฉfinissez l’argument ๐ซโ€Œ๐šโ€Œ๐ฐโ€Œ sur T๐ซโ€Œ๐ฎโ€Œ๐žโ€Œ , ils sont transmis sous forme de tableaux NumPy ( ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ซโ€Œ๐ซโ€Œ๐šโ€Œ๐ฒโ€Œ ).

df = pd.DataFrame([[10, 20, 30], [40, 50, 60]], index=['X', 'Y'], columns=['A', 'B', 'C']) print(df) # A B C # X 10 20 30 # Y 40 50 60 print(df.apply(lambda x: type(x), raw=True)) # A <class 'numpy.ndarray'> # B <class 'numpy.ndarray'> # C <class 'numpy.ndarray'> # dtype: object 

Si aucun S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ n’est nรฉcessaire, l’utilisation de ๐ซโ€Œ๐šโ€Œ๐ฐโ€Œ=T๐ซโ€Œ๐ฎโ€Œ๐žโ€Œ est plus rapide puisque le processus de conversion est omis. Cependant, si la fonction nรฉcessite des mรฉthodes ou des attributs S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ , la dรฉfinition de ๐ซโ€Œ๐šโ€Œ๐ฐโ€Œ=T๐ซโ€Œ๐ฎโ€Œ๐žโ€Œ gรฉnรจre une erreur.

print(df.apply(lambda x: x.name * 3)) # A AAA # B BBB # C CCC # dtype: object # print(df.apply(lambda x: x.name * 3, raw=True)) # AttributeError: 'numpy.ndarray' object has no attribute 'name' 

Appliquer des fonctions ร  des lignes ou des colonnes spรฉcifiques

Pour appliquer une fonction ร  une ligne ou une colonne spรฉcifique, extrayez la ligne ou la colonne sous forme de S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ et utilisez les mรฉthodes ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() ou ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ() de S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ .

df = pd.DataFrame([[10, 20, 30], [40, 50, 60]], index=['X', 'Y'], columns=['A', 'B', 'C']) print(df) # A B C # X 10 20 30 # Y 40 50 60 print(df['A'].map(lambda x: x**2)) # X 100 # Y 1600 # Name: A, dtype: int64 print(df.loc['Y'].map(hex)) # A 0x28 # B 0x32 # C 0x3c # Name: Y, dtype: object 

Vous pouvez les ajouter en tant que nouvelles lignes ou colonnes. Si les mรชmes noms de lignes ou de colonnes sont spรฉcifiรฉs, ils seront รฉcrasรฉs.

df['A'] = df['A'].map(lambda x: x**2) df.loc['Y_hex'] = df.loc['Y'].map(hex) print(df) # A B C # X 100 20 30 # Y 1600 50 60 # Y_hex 0x640 0x32 0x3c 

Utiliser les mรฉthodes D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ et S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ et les opรฉrateurs arithmรฉtiques

Dans pandas, les opรฉrations courantes sont fournies sous forme de mรฉthodes pour D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ et S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ , il n’est donc pas nรฉcessaire d’utiliser ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() ou ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ() .

df = pd.DataFrame([[1, -2, 3], [-4, 5, -6]], index=['X', 'Y'], columns=['A', 'B', 'C']) print(df) # A B C # X 1 -2 3 # Y -4 5 -6 print(df.abs()) # A B C # X 1 2 3 # Y 4 5 6 print(df.sum()) # A -3 # B 3 # C -3 # dtype: int64 print(df.sum(axis=1)) # X 2 # Y -5 # dtype: int64 

Pour une liste des mรฉthodes disponibles, reportez-vous ร  la documentation officielle.

Vous pouvez รฉgalement traiter D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ et S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ directement ร  l’aide d’opรฉrateurs arithmรฉtiques.

print(df * 10) # A B C # X 10 -20 30 # Y -40 50 -60 print(df['A'].abs() + df['B'] * 100) # X -199 # Y 504 # dtype: int64 

Des mรฉthodes de manipulation de chaรฎnes sont รฉgalement disponibles via l’accesseur ๐ฌโ€Œ๐ญโ€Œ๐ซโ€Œ de S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ .

df = pd.DataFrame([['a', 'ab', 'abc'], ['x', 'xy', 'xyz']], index=['X', 'Y'], columns=['A', 'B', 'C']) print(df) # A B C # X a ab abc # Y x xy xyz print(df['A'] + '-' + df['B'].str.upper() + '-' + df['C'].str.title()) # X a-AB-Abc # Y x-XY-Xyz # dtype: object 

Utiliser les fonctions NumPy

Vous pouvez traiter D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ et S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ en transmettant aux fonctions NumPy.

Par exemple, bien que pandas ne fournisse pas de mรฉthode pour tronquer les dรฉcimales, vous pouvez utiliser ๐งโ€Œ๐ฉโ€Œ.๐Ÿโ€Œ๐ฅโ€Œ๐จโ€Œ๐จโ€Œ๐ซโ€Œ() ร  la place. Pour D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ , un D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ est renvoyรฉ ; pour S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ , un S๐žโ€Œ๐ซโ€Œ๐ขโ€Œ๐žโ€Œ๐ฌโ€Œ est renvoyรฉ.

df = pd.DataFrame([[0.1, 0.5, 0.9], [-0.1, -0.5, -0.9]], index=['X', 'Y'], columns=['A', 'B', 'C']) print(df) # A B C # X 0.1 0.5 0.9 # Y -0.1 -0.5 -0.9 print(np.floor(df)) # A B C # X 0.0 0.0 0.0 # Y -1.0 -1.0 -1.0 print(type(np.floor(df))) # <class 'pandas.core.frame.DataFrame'> print(np.floor(df['A'])) # X 0.0 # Y -1.0 # Name: A, dtype: float64 print(type(np.floor(df['A']))) # <class 'pandas.core.series.Series'> 

Il est รฉgalement possible de dรฉfinir l’argument ๐šโ€Œ๐ฑโ€Œ๐ขโ€Œ๐ฌโ€Œ dans la fonction NumPy.

print(np.sum(df, axis=0)) # A 0.0 # B 0.0 # C 0.0 # dtype: float64 print(np.sum(df, axis=1)) # X 1.5 # Y -1.5 # dtype: float64 print(type(np.sum(df, axis=0))) # <class 'pandas.core.series.Series'> 

Comparaison de vitesse

Comparez les vitesses de traitement des mรฉthodes ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() et ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ() de D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ avec d’autres mรฉthodes dรฉdiรฉes et fonctions NumPy.

Considรฉrez un D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ avec 100 lignes et 100 colonnes.

df = pd.DataFrame(np.arange(-5000, 5000).reshape(100, 100)) print(df.shape) # (100, 100) 

Notez que les exemples suivants utilisent la commande magique %%๐ญโ€Œ๐ขโ€Œ๐ฆโ€Œ๐žโ€Œ๐ขโ€Œ๐ญโ€Œ dans Jupyter Notebook. Ils ne fonctionneront pas s’ils sont exรฉcutรฉs en tant que script Python.

Les rรฉsultats de l’utilisation de la fonction intรฉgrรฉe ๐šโ€Œ๐›โ€Œ๐ฌโ€Œ() avec ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() , comparรฉs ร  l’utilisation de la mรฉthode ๐šโ€Œ๐›โ€Œ๐ฌโ€Œ() de D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ et de la fonction ๐งโ€Œ๐ฉโ€Œ.๐šโ€Œ๐›โ€Œ๐ฌโ€Œ() , sont les suivants. On peut observer que ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() est plus prรชtรฉ.

%%timeit df.map(abs) # 2.07 ms ยฑ 16.5 ยตs per loop (mean ยฑ std. dev. of 7 runs, 100 loops each) %%timeit df.abs() # 5.06 ยตs ยฑ 55 ns per loop (mean ยฑ std. dev. of 7 runs, 100,000 loops each) %%timeit np.abs(df) # 7.81 ยตs ยฑ 120 ns per loop (mean ยฑ std. dev. of 7 runs, 100,000 loops each) 

Les rรฉsultats de l’utilisation de la fonction intรฉgrรฉe ๐ฌโ€Œ๐ฎโ€Œ๐ฆโ€Œ() avec ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ() , comparรฉs ร  l’utilisation de la mรฉthode ๐ฌโ€Œ๐ฎโ€Œ๐ฆโ€Œ() de D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ et de la fonction ๐งโ€Œ๐ฉโ€Œ.๐ฌโ€Œ๐ฎโ€Œ๐ฆโ€Œ() , sont les suivants. On peut voir que ๐šโ€Œ๐ฉโ€Œ๐ฉโ€Œ๐ฅโ€Œ๐ฒโ€Œ() est plus carรชme. Bien que le rรฉglage ๐ซโ€Œ๐šโ€Œ๐ฐโ€Œ=T๐ซโ€Œ๐ฎโ€Œ๐žโ€Œ l’accรฉlรจre, il est toujours significativement plus lent que ๐ฌโ€Œ๐ฎโ€Œ๐ฆโ€Œ() de D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ ou ๐งโ€Œ๐ฉโ€Œ.๐ฌโ€Œ๐ฎโ€Œ๐ฆโ€Œ() .

%%timeit df.apply(sum) # 932 ยตs ยฑ 95.8 ยตs per loop (mean ยฑ std. dev. of 7 runs, 1,000 loops each) %%timeit df.apply(sum, raw=True) # 427 ยตs ยฑ 4.8 ยตs per loop (mean ยฑ std. dev. of 7 runs, 1,000 loops each) %%timeit df.sum() # 35 ยตs ยฑ 140 ns per loop (mean ยฑ std. dev. of 7 runs, 10,000 loops each) %%timeit np.sum(df, axis=0) # 37.3 ยตs ยฑ 66.9 ns per loop (mean ยฑ std. dev. of 7 runs, 10,000 loops each) 

Les mรฉthodes ๐ฆโ€Œ๐šโ€Œ๐ฉโ€Œ() et ๐šโ€Œ๐ฉโ€Œ๐ฉ๐ฅโ€Œ๐ฒโ€Œ() doivent รชtre utilisรฉes principalement pour les opรฉrations complexes qui ne peuvent pas รชtre rรฉalisรฉes avec d’autres mรฉthodes ou fonctions NumPy. Si possible, il est prรฉfรฉrable d’utiliser d’autres mรฉthodes ou fonctions NumPy.