Cet article explique comment ajouter de nouvelles lignes/colonnes ร un ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ .
- Ajouter une colonne ร un ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ
- Ajouter une colonne en utilisant la notation entre crochets []
- La mรฉthode ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.D๐โ๐ญโ๐โF ๐ซโ๐โ๐ฆโ๐โ.๐โ๐ฌโ๐ฌ๐ขโ๐ โ๐งโ()
- La mรฉthode ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.D๐โ๐ญโ๐โF๐ซ โ๐โ๐ฆโ๐โ.๐ขโ๐งโ๐ฌโ๐โ๐ซโ๐ญโ()
- La fonction ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.๐โ๐จโ๐งโ๐โ๐โ๐ญโ()
- Ajouter une ligne ร un ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ
- Ajouter une ligne en utilisant .๐ฅโ๐จโ๐โ[]
- La mรฉthode ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.D๐โ๐ญโ๐โF๐ซ โ๐โ๐ฆโ๐โ.๐โ๐ฉโ๐ฉโ๐โ๐งโ๐โ() (obsolรจte dans la version 1.4.0 )
- La fonction ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.๐โ๐จโ๐งโ๐โ๐โ๐ญโ()
- Remarque : ajouter un grand nombre de lignes ou de colonnes
Notez que la mรฉthode ๐โ๐ฉโ๐ฉโ๐โ๐งโ๐โ() a รฉtรฉ dรฉconseillรฉe dans la version 1.4.0 et supprimรฉe dans la version 2.0.0 .
L’exemple de code de cet article utilise la version 2.0.3 de pandas .
import pandas as pd print(pd.__version__) # 2.0.3
Ajouter une colonne ร un ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ
Ajouter une colonne en utilisant la notation entre crochets []
Vous pouvez sรฉlectionner une colonne ร l’aide de [๐โ๐จโ๐ฅโ๐ฎโ๐ฆโ๐งโ_๐งโ๐โ๐ฆโ๐โ] et lui attribuer des valeurs.
df = pd.DataFrame({'A': ['A1', 'A2', 'A3'], 'B': ['B1', 'B2', 'B3'], 'C': ['C1', 'C2', 'C3']}, index=['ONE', 'TWO', 'THREE']) print(df) # A B C # ONE A1 B1 C1 # TWO A2 B2 C2 # THREE A3 B3 C3 df['A'] = 0 print(df) # A B C # ONE 0 B1 C1 # TWO 0 B2 C2 # THREE 0 B3 C3
Si vous spรฉcifiez un nom de colonne inexistant, une nouvelle colonne sera ajoutรฉe avec la valeur attribuรฉe.
Attribuer une valeur รฉvolutive
Lorsqu’une valeur scalaire est attribuรฉe, tous les รฉlรฉments de la colonne sont dรฉfinis sur cette valeur.
df['D'] = 0 print(df) # A B C D # ONE 0 B1 C1 0 # TWO 0 B2 C2 0 # THREE 0 B3 C3 0
Affecter un objet de type tableau
Si un objet de type tableau tel qu’une liste ou un tableau NumPy ๐งโ๐โ๐โ๐ซโ๐ซโ๐โ๐ฒโ est affectรฉ, chaque รฉlรฉment est affectรฉ directement. Notez qu’une incompatibilitรฉ entre le nombre d’รฉlรฉments de la liste et le nombre de lignes entraรฎnera une erreur.
df['E'] = [0, 1, 2] print(df) # A B C D E # ONE 0 B1 C1 0 0 # TWO 0 B2 C2 0 1 # THREE 0 B3 C3 0 2 # df['F'] = [0, 1, 2, 3] # ValueError: Length of values does not match length of index
Attribuez un ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.S๐โ๐ซโ๐ขโ๐โ๐ฌโ
Vous pouvez รฉgalement attribuer un S๐โ๐ซโ๐ขโ๐โ๐ฌโ .
รtant donnรฉ que chaque colonne d’un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ est traitรฉe comme un S๐โ๐ซโ๐ขโ๐โ๐ฌโ , vous pouvez ajouter de nouvelles colonnes en fonction des rรฉsultats des opรฉrations ou des rรฉsultats. traitรฉs. de ces mรฉthodes.
df['F'] = df['B'] + df['C'] df['G'] = df['B'].str.lower() print(df) # A B C D E F G # ONE 0 B1 C1 0 0 B1C1 b1 # TWO 0 B2 C2 0 1 B2C2 b2 # THREE 0 B3 C3 0 2 B3C3 b3
Si l’รฉtiquette d’index du S๐โ๐ซโ๐ขโ๐โ๐ฌโ ne correspond pas au nom de colonne du D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ , une valeur manquante N๐โN est attribuรฉ.
s = pd.Series(['X2', 'X3', 'X4'], index=['TWO', 'THREE', 'FOUR'], name='X') print(s) # TWO X2 # THREE X3 # FOUR X4 # Name: X, dtype: object df['H'] = s print(df) # A B C D E F G H # ONE 0 B1 C1 0 0 B1C1 b1 NaN # TWO 0 B2 C2 0 1 B2C2 b2 X2 # THREE 0 B3 C3 0 2 B3C3 b3 X3
L’attribut ๐ฏโ๐โ๐ฅโ๐ฎโ๐โ๐ฌโ d’un S๐โ๐ซโ๐ขโ๐โ๐ฌโ renvoie un tableau NumPy ๐งโ๐โ๐โ๐ซโ๐ซ๐โ๐ฒโ , traitรฉ comme un objet de type tableau. Les รฉlรฉments sont attribuรฉs dans l’ordre, quel que soit le ๐ขโ๐งโ๐โ๐โ๐ฑโ . Notez qu’une erreur se produit si le nombre d’รฉlรฉments ne correspond pas au nombre de lignes.
print(s.values) # ['X2' 'X3' 'X4'] df['I'] = s.values print(df) # A B C D E F G H I # ONE 0 B1 C1 0 0 B1C1 b1 NaN X2 # TWO 0 B2 C2 0 1 B2C2 b2 X2 X3 # THREE 0 B3 C3 0 2 B3C3 b3 X3 X4
La mรฉthode ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.D๐โ๐ญโ๐โF ๐ซโ๐โ๐ฆโ๐โ.๐โ๐ฌโ๐ฌ๐ขโ๐ โ๐งโ()
La mรฉthode ๐โ๐ฌโ๐ฌโ๐ขโ๐ โ๐งโ() ajoute une nouvelle colonne ou attribue de nouvelles valeurs ร une colonne existante.
Vous pouvez prรฉciser le nom de la colonne et sa valeur ร l’aide de la structure d’argument de mot-clรฉ, . . . . . . . .
Si le nom de la colonne existe, la mรฉthode lui attribue la valeur. Si le nom de la colonne est nouveau, elle ajoute une nouvelle colonne. Cette mรฉthode renvoie un nouvel objet, tandis que l’objet d’origine reste identique.
df = pd.DataFrame({'A': ['A1', 'A2', 'A3'], 'B': ['B1', 'B2', 'B3'], 'C': ['C1', 'C2', 'C3']}, index=['ONE', 'TWO', 'THREE']) print(df.assign(A=0)) # A B C # ONE 0 B1 C1 # TWO 0 B2 C2 # THREE 0 B3 C3 print(df.assign(D=0)) # A B C D # ONE A1 B1 C1 0 # TWO A2 B2 C2 0 # THREE A3 B3 C3 0 print(df) # A B C # ONE A1 B1 C1 # TWO A2 B2 C2 # THREE A3 B3 C3
Tout comme lorsque vous ajoutez une colonne avec [๐โ๐จโ๐ฅโ๐ฎโ๐ฆโ๐งโ_๐งโ๐โ๐ฆโ๐โ] , vous pouvez dรฉfinir des listes ou des S๐โ๐ซโ๐ขโ๐โ๐ฌโ avec la mรฉthode ๐โ๐ฌโ๐ฌ๐ขโ๐ โ๐งโ() . Vous pouvez รฉgalement ajouter/affecter plusieurs colonnes simultanรฉment en spรฉcifiant plusieurs arguments de mot-clรฉ.
s = pd.Series(['X2', 'X3', 'X4'], index=['TWO', 'THREE', 'FOUR'], name='X') print(s) # TWO X2 # THREE X3 # FOUR X4 # Name: X, dtype: object df_new = df.assign(C='XXX', D=0, E=[0, 1, 2], F=s, G=s.values, H=df['A'] + df['B']) print(df_new) # A B C D E F G H # ONE A1 B1 XXX 0 0 NaN X2 A1B1 # TWO A2 B2 XXX 0 1 X2 X3 A2B2 # THREE A3 B3 XXX 0 2 X3 X4 A3B3
Notez que dans la mรฉthode ๐โ๐ฌโ๐ฌโ๐ขโ๐ โ๐งโ() , vous spรฉcifiez le nom de la colonne comme argument de mot-clรฉ. Par consรฉquent, les noms qui ne sont pas valides comme noms d’argument, tels que ceux avec des symboles autres que des traits de soulignement _ et des mots rรฉservรฉs, entraรฎneront une erreur. Pour plus d’informations sur les noms d’arguments acceptables en Python, reportez-vous ร l’article suivant.
La mรฉthode ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.D๐โ๐ญโ๐โF๐ซ โ๐โ๐ฆโ๐โ.๐ขโ๐งโ๐ฌโ๐โ๐ซโ๐ญโ()
La mรฉthode ๐ขโ๐งโ๐ฌโ๐โ๐ซโ๐ญโ() vous permet d’ajouter une colonne ร n’importe quelle position dans un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ .
Spรฉcifiez la position comme premier argument, le nom de la colonne comme deuxiรจme et la valeur ร attribuer comme troisiรจme.
Le troisiรจme argument peut accepter une valeur scalaire, un objet de type tableau tel qu’une liste ou un S๐โ๐ซโ๐ขโ๐โ๐ฌโ . Le concept est similaire aux exemples prรฉcรฉdents.
Le D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ original est directement mis ร jour.
df = pd.DataFrame({'A': ['A1', 'A2', 'A3'], 'B': ['B1', 'B2', 'B3'], 'C': ['C1', 'C2', 'C3']}, index=['ONE', 'TWO', 'THREE']) s = pd.Series(['X2', 'X3', 'X4'], index=['TWO', 'THREE', 'FOUR'], name='X') df.insert(2, 'X', 0) print(df) # A B X C # ONE A1 B1 0 C1 # TWO A2 B2 0 C2 # THREE A3 B3 0 C3 df.insert(0, 'Y', s) print(df) # Y A B X C # ONE NaN A1 B1 0 C1 # TWO X2 A2 B2 0 C2 # THREE X3 A3 B3 0 C3
Notez que la spรฉcification d’une valeur dรฉpasse le nombre de lignes comme premier argument provoquera une erreur. L’utilisation d’une valeur nรฉgative pour prรฉciser la position ร partir de la fin n’est pas autorisรฉe. Pour indiquer la fin comme position de la nouvelle colonne, utilisez ๐ฅโ๐โ๐งโ(๐โ๐โ.๐โ๐จโ๐ฅโ๐ฎโ๐ฆโ๐งโ๐ฌโ) ou ๐โ๐โ.๐ฌโ๐กโ๐โ๐ฉโ๐โ[1] pour obtenir le nombre de colonnes existantes.
# df.insert(10, 'Z', 10) # IndexError: index 10 is out of bounds for axis 0 with size 5 # df.insert(-1, 'Z', 10) # ValueError: unbounded slice
De plus, l’attribution d’un nom de colonne existant comme deuxiรจme argument entraรฎnera une erreur. Bien qu’il soit possible d’autoriser les doublons en dรฉfinissant l’argument ๐โ๐ฅโ๐ฅโ๐จโ๐ฐโ_๐โ๐ฎโ๐ฉโ๐ฅโ๐ขโ๐โ๐โ๐ญโ๐โ๐ฌโ sur T๐ซโ๐ฎโ๐โ , cela n’est pas recommandรฉ en raison de la confusion potentielle provoquรฉe par les noms de colonnes en double.
# df.insert(0, 'Y', 10) # ValueError: cannot insert Y, already exists df.insert(0, 'Y', 10, allow_duplicates=True) print(df) # Y Y A B X C # ONE 10 NaN A1 B1 0 C1 # TWO 10 X2 A2 B2 0 C2 # THREE 10 X3 A3 B3 0 C3
La fonction ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.๐โ๐จโ๐งโ๐โ๐โ๐ญโ()
Vous pouvez concatรฉner plusieurs objets D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ et S๐โ๐ซโ๐ขโ๐โ๐ฌโ ร l’aide de la fonction ๐โ๐จโ๐งโ๐โ๐โ๐ญโ() .
En concatรฉnant un S๐โ๐ซโ๐ขโ๐โ๐ฌโ ร un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ , vous pouvez ajouter une nouvelle colonne.
Dans les exemples prรฉcรฉdents, lors de l’ajout d’un S๐โ๐ซโ๐ขโ๐โ๐ฌโ , son attribut ๐งโ๐โ๐ฆโ๐โ a รฉtรฉ ignorรฉ. Cependant, lors de la concatรฉnation horizontale avec la fonction ๐โ๐จโ๐งโ๐โ๐โ๐ญโ() avec ๐โ๐ฑโ๐ขโ๐ฌโ=1 , le ๐งโ๐โ๐ฆโ๐โ du S๐โ๐ซโ๐ขโ๐โ๐ฌโ est utilisรฉ comme nom de colonne.
Spรฉcifiez une liste ou un tuple d’objets que vous souhaitez concatรฉner comme premier argument de ๐โ๐จโ๐งโ๐โ๐โ๐ญโ() .
df = pd.DataFrame({'A': ['A1', 'A2', 'A3'], 'B': ['B1', 'B2', 'B3'], 'C': ['C1', 'C2', 'C3']}, index=['ONE', 'TWO', 'THREE']) s = pd.Series(['X2', 'X3', 'X4'], index=['TWO', 'THREE', 'FOUR'], name='X') print(pd.concat([df, s], axis=1)) # A B C X # ONE A1 B1 C1 NaN # TWO A2 B2 C2 X2 # THREE A3 B3 C3 X3 # FOUR NaN NaN NaN X4
Pour conserver uniquement les lignes partageant des indices communs, spรฉcifiquesz ๐ฃโ๐จโ๐ขโ๐งโ=’๐ขโ๐งโ๐งโ๐โ๐ซโ’ .
print(pd.concat([df, s], axis=1, join='inner')) # A B C X # TWO A2 B2 C2 X2 # THREE A3 B3 C3 X3
La fonction vous permet de concatรฉner plusieurs objets S๐โ๐ซโ๐ขโ๐โ๐ฌโ et D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ .
s1 = pd.Series(['X1', 'X2', 'X3'], index=df.index, name='X') s2 = pd.Series(['Y1', 'Y2', 'Y3'], index=df.index, name='Y') df2 = pd.DataFrame({'df_col1': 0, 'df_col2': range(3)}, index=df.index) print(pd.concat([df, s1, s2, df2], axis=1)) # A B C X Y df_col1 df_col2 # ONE A1 B1 C1 X1 Y1 0 0 # TWO A2 B2 C2 X2 Y2 0 1 # THREE A3 B3 C3 X3 Y3 0 2
Ajouter une ligne ร un ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ
Ajouter une ligne en utilisant .๐ฅโ๐จโ๐โ[]
Vous pouvez sรฉlectionner une ligne en utilisant ๐ฅโ๐จโ๐โ[๐ซโ๐จโ๐ฐโ_๐งโ๐โ๐ฆโ๐โ] et lui attribuer des valeurs.
df = pd.DataFrame({'A': ['A1', 'A2', 'A3'], 'B': ['B1', 'B2', 'B3'], 'C': ['C1', 'C2', 'C3']}, index=['ONE', 'TWO', 'THREE']) print(df) # A B C # ONE A1 B1 C1 # TWO A2 B2 C2 # THREE A3 B3 C3 df.loc['ONE'] = 0 print(df) # A B C # ONE 0 0 0 # TWO A2 B2 C2 # THREE A3 B3 C3
Comme pour les colonnes, en spรฉcifiant un nom de ligne inexistant, vous pouvez ajouter la ligne et lui attribuer des valeurs.
L’approche est la mรชme que pour les colonnes. Vous pouvez attribuer une valeur scalaire ou un objet de type tableau.
df.loc['FOUR'] = 0 df.loc['FIVE'] = ['A5', 'B5', 'C5'] print(df) # A B C # ONE 0 0 0 # TWO A2 B2 C2 # THREE A3 B3 C3 # FOUR 0 0 0 # FIVE A5 B5 C5
Pour les objets de type tableau, assurez-vous que le nombre d’รฉlรฉments correspond au nombre de colonnes ; sinon, cela provoquera une erreur.
# df.loc['SIX'] = ['A6', 'B6'] # ValueError: cannot set a row with mismatched columns
Comme les colonnes, S๐โ๐ซโ๐ขโ๐โ๐ฌโ peut รฉgalement รชtre assignรฉ aux lignes. Si les รฉtiquettes ne correspondent pas, les valeurs manquantes N๐โN sont attribuรฉes. Si vous souhaitez ignorer les รฉtiquettes, vous pouvez utiliser ๐ฏโ๐โ๐ฅโ๐ฎโ๐โ๐ฌโ pour convertir en tableau NumPy ๐งโ๐โ๐โ๐ซโ๐ซโ๐โ๐ฒโ .
s = pd.Series(['B6', 'C6', 'D6'], index=['B', 'C', 'D'], name='SIX') print(s) # B B6 # C C6 # D D6 # Name: SIX, dtype: object df.loc['XXX'] = df.loc['TWO'] + df.loc['THREE'] df.loc['YYY'] = s df.loc['ZZZ'] = s.values print(df) # A B C # ONE 0 0 0 # TWO A2 B2 C2 # THREE A3 B3 C3 # FOUR 0 0 0 # FIVE A5 B5 C5 # XXX A2A3 B2B3 C2C3 # YYY NaN B6 C6 # ZZZ B6 C6 D6
La mรฉthode ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.D๐โ๐ญโ๐โF๐ซ โ๐โ๐ฆโ๐โ.๐โ๐ฉโ๐ฉโ๐โ๐งโ๐โ() (obsolรจte dans la version 1.4.0 )
La mรฉthode ๐โ๐ฉโ๐ฉโ๐โ๐งโ๐โ() รฉtait autrefois utilisรฉe pour ajouter de nouvelles lignes ร D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ . Cependant, cette mรฉthode a รฉtรฉ dรฉconseillรฉe dans la version 1.4.0 et supprimรฉe dans la version 2.0.0 .
- pandas.DataFrame.append โ documentation de pandas 1.4.4
- Nouveautรฉs de la version 1.4.0 (22 janvier 2022) โ Documentation pandas 2.0.3
Dans les notes de version, il est recommandรฉ d’utiliser plutรดt la fonction ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.๐โ๐จโ๐งโ๐โ๐โ๐ญโ() .
La fonction ๐ฉโ๐โ๐งโ๐โ๐โ๐ฌโ.๐โ๐จโ๐งโ๐โ๐โ๐ญโ()
Vous pouvez concatรฉner plusieurs objets D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ et S๐โ๐ซโ๐ขโ๐โ๐ฌโ ร l’aide de la fonction ๐โ๐จโ๐งโ๐โ๐โ๐ญโ() .
Spรฉcifiez une liste ou un tuple d’objets que vous souhaitez concatรฉner comme premier argument de ๐โ๐จโ๐งโ๐โ๐โ๐ญโ() . Par dรฉfaut, ils sont concatรฉnรฉs verticalement.
df1 = pd.DataFrame({'A': ['A1', 'A2', 'A3'], 'B': ['B1', 'B2', 'B3'], 'C': ['C1', 'C2', 'C3']}, index=['ONE', 'TWO', 'THREE']) print(df1) # A B C # ONE A1 B1 C1 # TWO A2 B2 C2 # THREE A3 B3 C3 df2 = pd.DataFrame({'B': ['B4', 'B5'], 'C': ['C4', 'C5'], 'D': ['D4', 'D5']}, index=['FOUR', 'FIVE']) print(df2) # B C D # FOUR B4 C4 D4 # FIVE B5 C5 D5 print(pd.concat([df1, df2])) # A B C D # ONE A1 B1 C1 NaN # TWO A2 B2 C2 NaN # THREE A3 B3 C3 NaN # FOUR NaN B4 C4 D4 # FIVE NaN B5 C5 D5
Pour conserver uniquement les colonnes qui partagent des noms communs, spรฉcifiquesz ๐ฃโ๐จโ๐ขโ๐งโ=’๐ขโ๐งโ๐งโ๐โ๐ซโ’ .
print(pd.concat([df1, df2], join='inner')) # B C # ONE B1 C1 # TWO B2 C2 # THREE B3 C3 # FOUR B4 C4 # FIVE B5 C5
Vous devez faire preuve de prudence lorsque vous concatรฉnez D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ et S๐โ๐ซโ๐ขโ๐โ๐ฌโ verticalement.
Par dรฉfaut, cela ressemble ร ceci.
s = pd.Series(['A4', 'B4', 'C4'], index=['A', 'B', 'C'], name='FOUR') print(s) # A A4 # B B4 # C C4 # Name: FOUR, dtype: object print(pd.concat([df1, s])) # A B C 0 # ONE A1 B1 C1 NaN # TWO A2 B2 C2 NaN # THREE A3 B3 C3 NaN # A NaN NaN NaN A4 # B NaN NaN NaN B4 # C NaN NaN NaN C4
En convertissant S๐โ๐ซโ๐ขโ๐โ๐ฌโ en D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ avec la mรฉthode ๐ญโ๐จโ_๐โ๐ซโ๐โ๐ฆโ๐โ() et en la transposant avec T , vous obtenez un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ sur une seule ligne. Vous pouvez concatรฉner ceci.
print(s.to_frame().T) # A B C # FOUR A4 B4 C4 print(pd.concat([df1, s.to_frame().T])) # A B C # ONE A1 B1 C1 # TWO A2 B2 C2 # THREE A3 B3 C3 # FOUR A4 B4 C4
Remarque : ajouter un grand nombre de lignes ou de colonnes
Il n’est pas recommandรฉ d’ajouter un grand nombre de lignes ou de colonnes ร un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆ๐โ individuellement en raison de l’inefficacitรฉ.
Par exemple, lorsque vous ajoutez une colonne ร la fois dans une boucle ๐โ๐จโ๐ซโ , un message P๐โ๐ซโ๐โ๐จโ๐ซโ๐ฆโ๐โ๐งโ๐โ๐โW๐โ๐ซโ๐งโ๐ขโ๐งโ๐ โ est รฉmis. Il semble รชtre รฉmis lorsque vous ajoutez plus de 100 colonnes.
df = pd.DataFrame() for i in range(101): df[i] = 0 # PerformanceWarning: DataFrame is highly fragmented. # This is usually the result of calling `frame.insert` many times, which has poor performance. # Consider joining all columns at once using pd.concat(axis=1) instead. # To get a de-fragmented frame, use `newframe = frame.copy()`
ร moins que vous n’ayez besoin d’utiliser les fonctionnalitรฉs de D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ chaque fois que vous ajoutez une ligne ou une colonne, il est prรฉfรฉrable de tout concatรฉner en une seule fois en utilisant ๐โ๐จโ๐งโ๐โ๐โ๐ญโ() , comme le suggรจre le message d’avertissement.
Une comparaison de la vitesse de traitement entre l’ajout un par un et l’ajout de tous en une seule fois sera introduite ร la fin.
Ajouter plusieurs lignes ร la fois
Prenons l’exemple suivant : D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ .
df = pd.DataFrame({'col1': [1, 2, 3], 'col2': [10, 20, 30], 'col3': [100, 200, 300]}, index=['row1', 'row2', 'row3']) print(df) # col1 col2 col3 # row1 1 10 100 # row2 2 20 200 # row3 3 30 300
Ajoutez les donnรฉes et les noms de ligne pour chaque ligne dans des listes distinctes. Bien que le contenu soit simplement crรฉรฉ ici, dans le code rรฉel, il est crรฉรฉ par un traitement de donnรฉes.
l_data = [] l_label = [] for i in range(4, 7): l_data.append([i, i * 10, i * 100]) l_label.append(f'row{i}') print(l_data) # [[4, 40, 400], [5, 50, 500], [6, 60, 600]] print(l_label) # ['row4', 'row5', 'row6']
Crรฉez un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ ร partir de ces listes et des noms de colonnes ๐โ๐จโ๐ฅโ๐ฎโ๐ฆโ๐งโ๐ฌโ du D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ d’origine , et concatรฉnez-le avec le D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ d’origine.
df_append = pd.DataFrame(l_data, index=l_label, columns=df.columns) print(df_append) # col1 col2 col3 # row4 4 40 400 # row5 5 50 500 # row6 6 60 600 df_result = pd.concat([df, df_append]) print(df_result) # col1 col2 col3 # row1 1 10 100 # row2 2 20 200 # row3 3 30 300 # row4 4 40 400 # row5 5 50 500 # row6 6 60 600
Ajouter plusieurs colonnes ร la fois
Le concept est le mรชme lors de l’ajout de colonnes que lors de l’ajout de lignes comme dรฉcrit ci-dessus.
Prenons l’exemple suivant : D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ .
df = pd.DataFrame({'col1': [1, 2, 3], 'col2': [10, 20, 30], 'col3': [100, 200, 300]}, index=['row1', 'row2', 'row3']) print(df) # col1 col2 col3 # row1 1 10 100 # row2 2 20 200 # row3 3 30 300
Ajoutez les donnรฉes et les noms de colonnes pour chaque colonne dans des listes sรฉparรฉes.
l_data = [] l_label = [] for i in range(3, 6): l_data.append([10**i, 2 * 10**i, 3 * 10**i]) l_label.append(f'col{i + 1}') print(l_data) # [[1000, 2000, 3000], [10000, 20000, 30000], [100000, 200000, 300000]] print(l_label) # ['col4', 'col5', 'col6']
Crรฉez un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ ร partir de ces listes et des noms de lignes ๐ขโ๐งโ๐โ๐โ๐ฑโ du D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ d’origine , et concatรฉnez-le avec le D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ d’origine. Notez que vous devez transposer la liste bidimensionnelle contenant les donnรฉes.
df_append = pd.DataFrame(zip(*l_data), index=df.index, columns=l_label) print(df_append) # col4 col5 col6 # row1 1000 10000 100000 # row2 2000 20000 200000 # row3 3000 30000 300000 df_result = pd.concat([df, df_append], axis=1) print(df_result) # col1 col2 col3 col4 col5 col6 # row1 1 10 100 1000 10000 100000 # row2 2 20 200 2000 20000 200000 # row3 3 30 300 3000 30000 300000
Comparaison de la vitesse de traitement
Comparez la vitesse de traitement entre l’ajout de lignes ou de colonnes une par une et leur ajout en une seule fois.
Les exemples suivants utilisent la commande magique Jupyter Notebook %%๐ญโ๐ขโ๐ฆโ๐โ๐ขโ๐ญโ . Notez que ces commandes ne fonctionneront pas si elles sont exรฉcutรฉes en tant que scripts Python.
Dans le cas de l’ajout de 1000 lignes :
%%timeit df_loc = pd.DataFrame([[0, 0, 0], [1, 1, 1], [2, 2, 2]]) for i in range(3, 1003): df_loc.loc[i] = [i] * 3 # 150 ms ยฑ 4.67 ms per loop (mean ยฑ std. dev. of 7 runs, 10 loops each)
%%timeit df = pd.DataFrame([[0, 0, 0], [1, 1, 1], [2, 2, 2]]) l_data = [] l_label = [] for i in range(3, 1003): l_data.append([i] * 3) l_label.append(i) df_concat = pd.concat([df, pd.DataFrame(l_data, index=l_label, columns=df.columns)]) # 487 ยตs ยฑ 12.5 ยตs per loop (mean ยฑ std. dev. of 7 runs, 1,000 loops each)
Dans le cas de l’ajout de 1000 colonnes :
%%timeit df_index = pd.DataFrame([[0, 0, 0], [1, 1, 1], [2, 2, 2]]) for i in range(3, 1003): df_index[i] = [0, 1, 2] # 31.2 ms ยฑ 578 ยตs per loop (mean ยฑ std. dev. of 7 runs, 10 loops each)
%%timeit df = pd.DataFrame([[0, 0, 0], [1, 1, 1], [2, 2, 2]]) l_data = [] l_label = [] for i in range(3, 1003): l_data.append([0, 1, 2]) l_label.append(i) df_concat = pd.concat([df, pd.DataFrame(zip(*l_data), index=df.index, columns=l_label)], axis=1) # 3.56 ms ยฑ 54.7 ยตs per loop (mean ยฑ std. dev. of 7 runs, 100 loops each)
Dans les deux cas, l’ajout de toutes les lignes ou colonnes en une seule fois s’avรจre nettement plus rapide.
