Python Pandas - Guide rapide
Pandas est une bibliothèque Python open source fournissant un outil de manipulation et d'analyse de données haute performance à l'aide de ses puissantes structures de données. Le nom Pandas est dérivé du mot Panel Data - une économétrie à partir de données multidimensionnelles.
En 2008, le développeur Wes McKinney a commencé à développer des pandas lorsqu'il avait besoin d'un outil flexible et performant pour l'analyse des données.
Avant Pandas, Python était principalement utilisé pour la collecte et la préparation de données. Il a très peu contribué à l'analyse des données. Les pandas ont résolu ce problème. En utilisant Pandas, nous pouvons accomplir cinq étapes typiques dans le traitement et l'analyse des données, quelle que soit l'origine des données: charger, préparer, manipuler, modéliser et analyser.
Python with Pandas est utilisé dans un large éventail de domaines, y compris les domaines académiques et commerciaux, notamment la finance, l'économie, les statistiques, l'analyse, etc.
Principales caractéristiques des pandas
- Objet DataFrame rapide et efficace avec indexation par défaut et personnalisée.
- Outils de chargement de données dans des objets de données en mémoire à partir de différents formats de fichiers.
- Alignement des données et traitement intégré des données manquantes.
- Remodelage et pivotement des ensembles de dates.
- Découpage, indexation et sous-ensemble basés sur des étiquettes de grands ensembles de données.
- Les colonnes d'une structure de données peuvent être supprimées ou insérées.
- Regrouper par données pour l'agrégation et les transformations.
- Fusion et jonction de données haute performance.
- Fonctionnalité de série temporelle.
La distribution Python standard n'est pas fournie avec le module Pandas. Une alternative légère consiste à installer NumPy à l'aide du programme d'installation de package Python populaire,pip.
pip install pandas
Si vous installez le package Anaconda Python, Pandas sera installé par défaut avec les éléments suivants -
les fenêtres
Anaconda (de https://www.continuum.io) est une distribution Python gratuite pour la pile SciPy. Il est également disponible pour Linux et Mac.
Canopy (https://www.enthought.com/products/canopy/) est disponible en tant que distribution gratuite et commerciale avec une pile SciPy complète pour Windows, Linux et Mac.
Python(x, y) est une distribution Python gratuite avec la pile SciPy et Spyder IDE pour Windows OS. (Téléchargeable depuishttp://python-xy.github.io/)
Linux
Les gestionnaires de packages des distributions Linux respectives sont utilisés pour installer un ou plusieurs packages dans la pile SciPy.
For Ubuntu Users
sudo apt-get install python-numpy python-scipy python-matplotlibipythonipythonnotebook
python-pandas python-sympy python-nose
For Fedora Users
sudo yum install numpyscipy python-matplotlibipython python-pandas sympy
python-nose atlas-devel
Pandas traite les trois structures de données suivantes -
- Series
- DataFrame
- Panel
Ces structures de données sont construites au-dessus du tableau Numpy, ce qui signifie qu'elles sont rapides.
Dimension et description
La meilleure façon de penser à ces structures de données est que la structure de données de dimension supérieure est un conteneur de sa structure de données de dimension inférieure. Par exemple, DataFrame est un conteneur de Series, Panel est un conteneur de DataFrame.
Structure de données | Dimensions | La description |
---|---|---|
Séries | 1 | Tableau homogène marqué 1D, taille immuable. |
Cadres de données | 2 | Structure tabulaire générale 2D étiquetée et modifiable en taille avec des colonnes de typage potentiellement hétérogène. |
Panneau | 3 | Tableau général étiqueté 3D, taille modifiable. |
La construction et la manipulation de tableaux à deux dimensions ou plus est une tâche fastidieuse, la charge incombe à l'utilisateur de prendre en compte l'orientation de l'ensemble de données lors de l'écriture des fonctions. Mais en utilisant les structures de données Pandas, l'effort mental de l'utilisateur est réduit.
Par exemple, avec des données tabulaires (DataFrame), il est plus sémantiquement utile de penser à la index (les rangées) et le columns plutôt que l'axe 0 et l'axe 1.
Mutabilité
Toutes les structures de données Pandas sont modifiables en valeur (peuvent être modifiées) et à l'exception des séries, toutes sont modifiables en taille. La série est de taille immuable.
Note- DataFrame est largement utilisé et l'une des structures de données les plus importantes. Le panneau est beaucoup moins utilisé.
Séries
La série est une structure de type tableau unidimensionnelle avec des données homogènes. Par exemple, la série suivante est une collection d'entiers 10, 23, 56,…
dix | 23 | 56 | 17 | 52 | 61 | 73 | 90 | 26 | 72 |
Points clés
- Données homogènes
- Taille immuable
- Valeurs de données mutables
Trame de données
DataFrame est un tableau à deux dimensions avec des données hétérogènes. Par exemple,
Nom | Âge | Le sexe | Évaluation |
---|---|---|---|
Steve | 32 | Masculin | 3,45 |
Lia | 28 | Femme | 4.6 |
Vin | 45 | Masculin | 3,9 |
Katie | 38 | Femme | 2,78 |
Le tableau représente les données d'une équipe de vente d'une organisation avec leur note de performance globale. Les données sont représentées en lignes et en colonnes. Chaque colonne représente un attribut et chaque ligne représente une personne.
Type de données des colonnes
Les types de données des quatre colonnes sont les suivants -
Colonne | Type |
---|---|
Nom | Chaîne |
Âge | Entier |
Le sexe | Chaîne |
Évaluation | Flotte |
Points clés
- Données hétérogènes
- Taille Mutable
- Données mutables
Panneau
Panel est une structure de données tridimensionnelle avec des données hétérogènes. Il est difficile de représenter le panneau sous forme de représentation graphique. Mais un panneau peut être illustré comme un conteneur de DataFrame.
Points clés
- Données hétérogènes
- Taille Mutable
- Données mutables
Series est un tableau étiqueté unidimensionnel capable de contenir des données de tout type (entier, chaîne, flottant, objets python, etc.). Les étiquettes des axes sont appelées collectivement index.
pandas.Série
Une série pandas peut être créée en utilisant le constructeur suivant -
pandas.Series( data, index, dtype, copy)
Les paramètres du constructeur sont les suivants -
Sr.Non | Paramètre et description |
---|---|
1 | data les données prennent diverses formes comme ndarray, liste, constantes |
2 | index Les valeurs d'index doivent être uniques et hachables, de la même longueur que les données. Défautnp.arange(n) si aucun index n'est passé. |
3 | dtype dtype est pour le type de données. Si aucun, le type de données sera déduit |
4 | copy Copiez les données. Valeur par défaut False |
Une série peut être créée en utilisant diverses entrées telles que -
- Array
- Dict
- Valeur scalaire ou constante
Créer une série vide
Une série de base qui peut être créée est une série vide.
Exemple
#import the pandas library and aliasing as pd
import pandas as pd
s = pd.Series()
print s
Ses output est comme suit -
Series([], dtype: float64)
Créer une série à partir de ndarray
Si data est un ndarray, alors l'index passé doit être de la même longueur. Si aucun index n'est passé, l'index par défaut serarange(n) où n est la longueur du tableau, c'est-à-dire [0,1,2,3…. range(len(array))-1].
Exemple 1
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
s = pd.Series(data)
print s
Ses output est comme suit -
0 a
1 b
2 c
3 d
dtype: object
Nous n'avons passé aucun index, donc par défaut, il a attribué les index allant de 0 à len(data)-1, c'est-à-dire de 0 à 3.
Exemple 2
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
s = pd.Series(data,index=[100,101,102,103])
print s
Ses output est comme suit -
100 a
101 b
102 c
103 d
dtype: object
Nous avons transmis les valeurs d'index ici. Nous pouvons maintenant voir les valeurs indexées personnalisées dans la sortie.
Créer une série à partir de dict
UNE dictpeut être passé en entrée et si aucun index n'est spécifié, les clés du dictionnaire sont prises dans un ordre trié pour construire l'index. Siindex est passé, les valeurs des données correspondant aux étiquettes de l'index seront extraites.
Exemple 1
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = {'a' : 0., 'b' : 1., 'c' : 2.}
s = pd.Series(data)
print s
Ses output est comme suit -
a 0.0
b 1.0
c 2.0
dtype: float64
Observe - Les clés de dictionnaire sont utilisées pour construire l'index.
Exemple 2
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = {'a' : 0., 'b' : 1., 'c' : 2.}
s = pd.Series(data,index=['b','c','d','a'])
print s
Ses output est comme suit -
b 1.0
c 2.0
d NaN
a 0.0
dtype: float64
Observe - L'ordre d'index est conservé et l'élément manquant est rempli avec NaN (Not a Number).
Créer une série à partir de Scalar
Si les données sont une valeur scalaire, un index doit être fourni. La valeur sera répétée pour correspondre à la longueur deindex
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
s = pd.Series(5, index=[0, 1, 2, 3])
print s
Ses output est comme suit -
0 5
1 5
2 5
3 5
dtype: int64
Accès aux données d'une série avec position
L'accès aux données de la série est similaire à celui d'un ndarray.
Exemple 1
Récupérez le premier élément. Comme nous le savons déjà, le comptage commence à zéro pour le tableau, ce qui signifie que le premier élément est stocké à zéro ème position et ainsi de suite.
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#retrieve the first element
print s[0]
Ses output est comme suit -
1
Exemple 2
Récupérez les trois premiers éléments de la série. Si un: est inséré devant lui, tous les éléments de cet index seront extraits. Si deux paramètres (avec: entre eux) sont utilisés, les éléments entre les deux index (sans compter l'index d'arrêt)
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#retrieve the first three element
print s[:3]
Ses output est comme suit -
a 1
b 2
c 3
dtype: int64
Exemple 3
Récupérez les trois derniers éléments.
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#retrieve the last three element
print s[-3:]
Ses output est comme suit -
c 3
d 4
e 5
dtype: int64
Récupérer des données à l'aide de l'étiquette (index)
Une série est comme une taille fixe dict en ce que vous pouvez obtenir et définir des valeurs par étiquette d'index.
Exemple 1
Récupérez un seul élément à l'aide de la valeur d'étiquette d'index.
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#retrieve a single element
print s['a']
Ses output est comme suit -
1
Exemple 2
Récupérez plusieurs éléments à l'aide d'une liste de valeurs d'étiquettes d'index.
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#retrieve multiple elements
print s[['a','c','d']]
Ses output est comme suit -
a 1
c 3
d 4
dtype: int64
Exemple 3
Si aucune étiquette n'est contenue, une exception est déclenchée.
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#retrieve multiple elements
print s['f']
Ses output est comme suit -
…
KeyError: 'f'
Une trame de données est une structure de données bidimensionnelle, c'est-à-dire que les données sont alignées de manière tabulaire en lignes et en colonnes.
Caractéristiques de DataFrame
- Potentiellement, les colonnes sont de types différents
- Taille - Mutable
- Axes étiquetés (lignes et colonnes)
- Peut effectuer des opérations arithmétiques sur les lignes et les colonnes
Structure
Supposons que nous créons une base de données avec les données des élèves.
Vous pouvez le considérer comme une table SQL ou une représentation de données de feuille de calcul.
pandas.DataFrame
Un DataFrame pandas peut être créé en utilisant le constructeur suivant -
pandas.DataFrame( data, index, columns, dtype, copy)
Les paramètres du constructeur sont les suivants -
Sr.Non | Paramètre et description |
---|---|
1 | data les données prennent diverses formes comme ndarray, series, map, lists, dict, constants et aussi un autre DataFrame. |
2 | index Pour les étiquettes de ligne, l'index à utiliser pour l'image résultante est facultatif Par défaut np.arange (n) si aucun index n'est passé. |
3 | columns Pour les étiquettes de colonne, la syntaxe par défaut facultative est - np.arange (n). Ceci n'est vrai que si aucun index n'est passé. |
4 | dtype Type de données de chaque colonne. |
5 | copy Cette commande (ou quoi que ce soit) est utilisée pour copier des données, si la valeur par défaut est False. |
Créer DataFrame
Un pandas DataFrame peut être créé en utilisant diverses entrées comme -
- Lists
- dict
- Series
- Numpy ndarrays
- Un autre DataFrame
Dans les sections suivantes de ce chapitre, nous verrons comment créer un DataFrame en utilisant ces entrées.
Créer un DataFrame vide
Un DataFrame de base, qui peut être créé est un Dataframe vide.
Exemple
#import the pandas library and aliasing as pd
import pandas as pd
df = pd.DataFrame()
print df
Ses output est comme suit -
Empty DataFrame
Columns: []
Index: []
Créer un DataFrame à partir de listes
Le DataFrame peut être créé à l'aide d'une seule liste ou d'une liste de listes.
Exemple 1
import pandas as pd
data = [1,2,3,4,5]
df = pd.DataFrame(data)
print df
Ses output est comme suit -
0
0 1
1 2
2 3
3 4
4 5
Exemple 2
import pandas as pd
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'])
print df
Ses output est comme suit -
Name Age
0 Alex 10
1 Bob 12
2 Clarke 13
Exemple 3
import pandas as pd
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'],dtype=float)
print df
Ses output est comme suit -
Name Age
0 Alex 10.0
1 Bob 12.0
2 Clarke 13.0
Note - Observez, le dtype paramètre change le type de colonne Age en virgule flottante.
Créer un DataFrame à partir de Dict of ndarrays / Lists
Tous les ndarraysdoit être de même longueur. Si l'index est passé, la longueur de l'index doit être égale à la longueur des tableaux.
Si aucun index n'est passé, alors par défaut, l'index sera range (n), où n est la longueur du tableau.
Exemple 1
import pandas as pd
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data)
print df
Ses output est comme suit -
Age Name
0 28 Tom
1 34 Jack
2 29 Steve
3 42 Ricky
Note- Respectez les valeurs 0,1,2,3. Il s'agit de l'index par défaut attribué à chacun à l'aide de la plage de fonctions (n).
Exemple 2
Créons maintenant un DataFrame indexé à l'aide de tableaux.
import pandas as pd
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data, index=['rank1','rank2','rank3','rank4'])
print df
Ses output est comme suit -
Age Name
rank1 28 Tom
rank2 34 Jack
rank3 29 Steve
rank4 42 Ricky
Note - Observez, le index attribue un index à chaque ligne.
Créer un DataFrame à partir de la liste des dictionnaires
La liste des dictionnaires peut être transmise en tant que données d'entrée pour créer un DataFrame. Les clés du dictionnaire sont prises par défaut comme noms de colonne.
Exemple 1
L'exemple suivant montre comment créer un DataFrame en passant une liste de dictionnaires.
import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
print df
Ses output est comme suit -
a b c
0 1 2 NaN
1 5 10 20.0
Note - Observez, NaN (Not a Number) est ajouté dans les zones manquantes.
Exemple 2
L'exemple suivant montre comment créer un DataFrame en passant une liste de dictionnaires et les index de ligne.
import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data, index=['first', 'second'])
print df
Ses output est comme suit -
a b c
first 1 2 NaN
second 5 10 20.0
Exemple 3
L'exemple suivant montre comment créer un DataFrame avec une liste de dictionnaires, d'index de ligne et d'index de colonne.
import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
#With two column indices, values same as dictionary keys
df1 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b'])
#With two column indices with one index with other name
df2 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b1'])
print df1
print df2
Ses output est comme suit -
#df1 output
a b
first 1 2
second 5 10
#df2 output
a b1
first 1 NaN
second 5 NaN
Note- Remarquez que df2 DataFrame est créé avec un index de colonne autre que la clé de dictionnaire; ainsi, ajouté les NaN en place. Alors que df1 est créé avec des index de colonne identiques aux clés de dictionnaire, NaN est donc ajouté.
Créer un DataFrame à partir de Dict of Series
Dictionary of Series peut être transmis pour former un DataFrame. L'index résultant est l'union de tous les index de séries passés.
Exemple
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df
Ses output est comme suit -
one two
a 1.0 1
b 2.0 2
c 3.0 3
d NaN 4
Note - Attention, pour la série un, il n'y a pas d'étiquette ‘d’ passé, mais dans le résultat, pour le d label, NaN est ajouté avec NaN.
Comprenons maintenant column selection, addition, et deletion à travers des exemples.
Sélection de colonne
Nous comprendrons cela en sélectionnant une colonne dans le DataFrame.
Exemple
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df ['one']
Ses output est comme suit -
a 1.0
b 2.0
c 3.0
d NaN
Name: one, dtype: float64
Ajout de colonne
Nous comprendrons cela en ajoutant une nouvelle colonne à un bloc de données existant.
Exemple
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
# Adding a new column to an existing DataFrame object with column label by passing new series
print ("Adding a new column by passing as Series:")
df['three']=pd.Series([10,20,30],index=['a','b','c'])
print df
print ("Adding a new column using the existing columns in DataFrame:")
df['four']=df['one']+df['three']
print df
Ses output est comme suit -
Adding a new column by passing as Series:
one two three
a 1.0 1 10.0
b 2.0 2 20.0
c 3.0 3 30.0
d NaN 4 NaN
Adding a new column using the existing columns in DataFrame:
one two three four
a 1.0 1 10.0 11.0
b 2.0 2 20.0 22.0
c 3.0 3 30.0 33.0
d NaN 4 NaN NaN
Suppression de colonne
Les colonnes peuvent être supprimées ou sautées; prenons un exemple pour comprendre comment.
Exemple
# Using the previous DataFrame, we will delete a column
# using del function
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']),
'three' : pd.Series([10,20,30], index=['a','b','c'])}
df = pd.DataFrame(d)
print ("Our dataframe is:")
print df
# using del function
print ("Deleting the first column using DEL function:")
del df['one']
print df
# using pop function
print ("Deleting another column using POP function:")
df.pop('two')
print df
Ses output est comme suit -
Our dataframe is:
one three two
a 1.0 10.0 1
b 2.0 20.0 2
c 3.0 30.0 3
d NaN NaN 4
Deleting the first column using DEL function:
three two
a 10.0 1
b 20.0 2
c 30.0 3
d NaN 4
Deleting another column using POP function:
three
a 10.0
b 20.0
c 30.0
d NaN
Sélection, ajout et suppression de lignes
Nous allons maintenant comprendre la sélection, l'ajout et la suppression de lignes à travers des exemples. Commençons par le concept de sélection.
Sélection par étiquette
Les lignes peuvent être sélectionnées en passant l'étiquette de ligne à un loc fonction.
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df.loc['b']
Ses output est comme suit -
one 2.0
two 2.0
Name: b, dtype: float64
Le résultat est une série avec des étiquettes comme noms de colonne du DataFrame. Et, le nom de la série est l'étiquette avec laquelle elle est récupérée.
Sélection par emplacement entier
Les lignes peuvent être sélectionnées en passant un emplacement entier à un iloc fonction.
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df.iloc[2]
Ses output est comme suit -
one 3.0
two 3.0
Name: c, dtype: float64
Trancher les lignes
Plusieurs lignes peuvent être sélectionnées à l'aide de l'opérateur ':'.
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df[2:4]
Ses output est comme suit -
one two
c 3.0 3
d NaN 4
Ajout de lignes
Ajouter de nouvelles lignes à un DataFrame à l'aide du appendfonction. Cette fonction ajoutera les lignes à la fin.
import pandas as pd
df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])
df = df.append(df2)
print df
Ses output est comme suit -
a b
0 1 2
1 3 4
0 5 6
1 7 8
Suppression de lignes
Utilisez l'étiquette d'index pour supprimer ou supprimer des lignes d'un DataFrame. Si l'étiquette est dupliquée, plusieurs lignes seront supprimées.
Si vous observez, dans l'exemple ci-dessus, les étiquettes sont dupliquées. Laissez-nous déposer une étiquette et verrons combien de lignes seront supprimées.
import pandas as pd
df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])
df = df.append(df2)
# Drop rows with label 0
df = df.drop(0)
print df
Ses output est comme suit -
a b
1 3 4
1 7 8
Dans l'exemple ci-dessus, deux lignes ont été supprimées car ces deux contiennent la même étiquette 0.
UNE panelest un conteneur 3D de données. Le termePanel data est dérivé de l'économétrie et est en partie responsable du nom de pandas - pan(el)-da(ta)-s.
Les noms des 3 axes sont destinés à donner une signification sémantique à la description des opérations impliquant des données de panel. Ils sont -
items - axe 0, chaque élément correspond à un DataFrame contenu à l'intérieur.
major_axis - axe 1, c'est l'index (lignes) de chacun des DataFrames.
minor_axis - axe 2, ce sont les colonnes de chacun des DataFrames.
pandas.Panel ()
Un Panel peut être créé en utilisant le constructeur suivant -
pandas.Panel(data, items, major_axis, minor_axis, dtype, copy)
Les paramètres du constructeur sont les suivants -
Paramètre | La description |
---|---|
Les données | Les données prennent diverses formes telles que ndarray, séries, carte, listes, dict, constantes et également un autre DataFrame |
articles | axe = 0 |
major_axis | axe = 1 |
axe_mineur | axe = 2 |
dtype | Type de données de chaque colonne |
copie | Copiez les données. Défaut,false |
Créer un panneau
Un panneau peut être créé de plusieurs façons comme -
- Chez ndarrays
- À partir de dict de DataFrames
À partir de 3D ndarray
# creating an empty panel
import pandas as pd
import numpy as np
data = np.random.rand(2,4,5)
p = pd.Panel(data)
print p
Ses output est comme suit -
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 4 (major_axis) x 5 (minor_axis)
Items axis: 0 to 1
Major_axis axis: 0 to 3
Minor_axis axis: 0 to 4
Note - Observez les dimensions du panneau vide et du panneau ci-dessus, tous les objets sont différents.
À partir de dict d'objets DataFrame
#creating an empty panel
import pandas as pd
import numpy as np
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p
Ses output est comme suit -
Dimensions: 2 (items) x 4 (major_axis) x 3 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 0 to 3
Minor_axis axis: 0 to 2
Créer un panneau vide
Un panneau vide peut être créé à l'aide du constructeur Panel comme suit -
#creating an empty panel
import pandas as pd
p = pd.Panel()
print p
Ses output est comme suit -
<class 'pandas.core.panel.Panel'>
Dimensions: 0 (items) x 0 (major_axis) x 0 (minor_axis)
Items axis: None
Major_axis axis: None
Minor_axis axis: None
Sélection des données à partir du panneau
Sélectionnez les données du panneau en utilisant -
- Items
- Major_axis
- Minor_axis
Utilisation des éléments
# creating an empty panel
import pandas as pd
import numpy as np
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p['Item1']
Ses output est comme suit -
0 1 2
0 0.488224 -0.128637 0.930817
1 0.417497 0.896681 0.576657
2 -2.775266 0.571668 0.290082
3 -0.400538 -0.144234 1.110535
Nous avons deux articles et nous avons récupéré item1. Le résultat est un DataFrame avec 4 lignes et 3 colonnes, qui sont lesMajor_axis et Minor_axis dimensions.
Utilisation de major_axis
Les données sont accessibles en utilisant la méthode panel.major_axis(index).
# creating an empty panel
import pandas as pd
import numpy as np
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p.major_xs(1)
Ses output est comme suit -
Item1 Item2
0 0.417497 0.748412
1 0.896681 -0.557322
2 0.576657 NaN
Utilisation de minor_axis
Les données sont accessibles en utilisant la méthode panel.minor_axis(index).
# creating an empty panel
import pandas as pd
import numpy as np
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p.minor_xs(1)
Ses output est comme suit -
Item1 Item2
0 -0.128637 -1.047032
1 0.896681 -0.557322
2 0.571668 0.431953
3 -0.144234 1.302466
Note - Observez les changements de dimensions.
À présent, nous avons découvert les trois structures de données Pandas et comment les créer. Nous nous concentrerons principalement sur les objets DataFrame en raison de son importance dans le traitement des données en temps réel et discuterons également de quelques autres DataStructures.
Fonctionnalité de base de la série
Sr.No. | Attribut ou méthode et description |
---|---|
1 | axes Renvoie une liste des étiquettes de l'axe des lignes |
2 | dtype Renvoie le dtype de l'objet. |
3 | empty Renvoie True si la série est vide. |
4 | ndim Renvoie le nombre de dimensions des données sous-jacentes, par définition 1. |
5 | size Renvoie le nombre d'éléments dans les données sous-jacentes. |
6 | values Renvoie la série sous la forme ndarray. |
sept | head() Renvoie les n premières lignes. |
8 | tail() Renvoie les n dernières lignes. |
Créons maintenant une série et voyons toutes les opérations d'attributs tabulés ci-dessus.
Exemple
import pandas as pd
import numpy as np
#Create a series with 100 random numbers
s = pd.Series(np.random.randn(4))
print s
Ses output est comme suit -
0 0.967853
1 -0.148368
2 -1.395906
3 -1.758394
dtype: float64
axes
Renvoie la liste des étiquettes de la série.
import pandas as pd
import numpy as np
#Create a series with 100 random numbers
s = pd.Series(np.random.randn(4))
print ("The axes are:")
print s.axes
Ses output est comme suit -
The axes are:
[RangeIndex(start=0, stop=4, step=1)]
Le résultat ci-dessus est un format compact d'une liste de valeurs de 0 à 5, c'est-à-dire [0,1,2,3,4].
vide
Renvoie la valeur booléenne indiquant si l'objet est vide ou non. True indique que l'objet est vide.
import pandas as pd
import numpy as np
#Create a series with 100 random numbers
s = pd.Series(np.random.randn(4))
print ("Is the Object empty?")
print s.empty
Ses output est comme suit -
Is the Object empty?
False
ndim
Renvoie le nombre de dimensions de l'objet. Par définition, une série est une structure de données 1D, elle renvoie donc
import pandas as pd
import numpy as np
#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print s
print ("The dimensions of the object:")
print s.ndim
Ses output est comme suit -
0 0.175898
1 0.166197
2 -0.609712
3 -1.377000
dtype: float64
The dimensions of the object:
1
Taille
Renvoie la taille (longueur) de la série.
import pandas as pd
import numpy as np
#Create a series with 4 random numbers
s = pd.Series(np.random.randn(2))
print s
print ("The size of the object:")
print s.size
Ses output est comme suit -
0 3.078058
1 -1.207803
dtype: float64
The size of the object:
2
valeurs
Renvoie les données réelles de la série sous forme de tableau.
import pandas as pd
import numpy as np
#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print s
print ("The actual data series is:")
print s.values
Ses output est comme suit -
0 1.787373
1 -0.605159
2 0.180477
3 -0.140922
dtype: float64
The actual data series is:
[ 1.78737302 -0.60515881 0.18047664 -0.1409218 ]
Tête et queue
Pour afficher un petit échantillon d'une série ou de l'objet DataFrame, utilisez les méthodes head () et tail ().
head() renvoie le premier nlignes (observez les valeurs d'index). Le nombre d'éléments à afficher par défaut est de cinq, mais vous pouvez transmettre un nombre personnalisé.
import pandas as pd
import numpy as np
#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print ("The original series is:")
print s
print ("The first two rows of the data series:")
print s.head(2)
Ses output est comme suit -
The original series is:
0 0.720876
1 -0.765898
2 0.479221
3 -0.139547
dtype: float64
The first two rows of the data series:
0 0.720876
1 -0.765898
dtype: float64
tail() renvoie le dernier nlignes (observez les valeurs d'index). Le nombre d'éléments à afficher par défaut est de cinq, mais vous pouvez transmettre un nombre personnalisé.
import pandas as pd
import numpy as np
#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print ("The original series is:")
print s
print ("The last two rows of the data series:")
print s.tail(2)
Ses output est comme suit -
The original series is:
0 -0.655091
1 -0.881407
2 -0.608592
3 -2.341413
dtype: float64
The last two rows of the data series:
2 -0.608592
3 -2.341413
dtype: float64
Fonctionnalité de base DataFrame
Voyons maintenant ce qu'est la fonctionnalité de base de DataFrame. Les tableaux suivants répertorient les attributs ou méthodes importants qui aident dans la fonctionnalité de base de DataFrame.
Sr.No. | Attribut ou méthode et description |
---|---|
1 | T Transpose les lignes et les colonnes. |
2 | axes Renvoie une liste avec les étiquettes d'axe de ligne et d'axe de colonne comme seuls membres. |
3 | dtypes Renvoie les dtypes de cet objet. |
4 | empty Vrai si NDFrame est entièrement vide [aucun élément]; si l'un des axes est de longueur 0. |
5 | ndim Nombre d'axes / dimensions du tableau. |
6 | shape Renvoie un tuple représentant la dimensionnalité du DataFrame. |
sept | size Nombre d'éléments dans le NDFrame. |
8 | values Représentation numpy de NDFrame. |
9 | head() Renvoie les n premières lignes. |
dix | tail() Renvoie les n dernières lignes. |
Créons maintenant un DataFrame et voyons comment fonctionnent les attributs mentionnés ci-dessus.
Exemple
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our data series is:")
print df
Ses output est comme suit -
Our data series is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
T (Transposer)
Renvoie la transposition du DataFrame. Les lignes et les colonnes seront échangées.
import pandas as pd
import numpy as np
# Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
# Create a DataFrame
df = pd.DataFrame(d)
print ("The transpose of the data series is:")
print df.T
Ses output est comme suit -
The transpose of the data series is:
0 1 2 3 4 5 6
Age 25 26 25 23 30 29 23
Name Tom James Ricky Vin Steve Smith Jack
Rating 4.23 3.24 3.98 2.56 3.2 4.6 3.8
axes
Renvoie la liste des étiquettes d'axe de ligne et d'axe de colonne.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Row axis labels and column axis labels are:")
print df.axes
Ses output est comme suit -
Row axis labels and column axis labels are:
[RangeIndex(start=0, stop=7, step=1), Index([u'Age', u'Name', u'Rating'],
dtype='object')]
dtypes
Renvoie le type de données de chaque colonne.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("The data types of each column are:")
print df.dtypes
Ses output est comme suit -
The data types of each column are:
Age int64
Name object
Rating float64
dtype: object
vide
Renvoie la valeur booléenne indiquant si l'objet est vide ou non; True indique que l'objet est vide.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Is the object empty?")
print df.empty
Ses output est comme suit -
Is the object empty?
False
ndim
Renvoie le nombre de dimensions de l'objet. Par définition, DataFrame est un objet 2D.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The dimension of the object is:")
print df.ndim
Ses output est comme suit -
Our object is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
The dimension of the object is:
2
forme
Renvoie un tuple représentant la dimensionnalité du DataFrame. Tuple (a, b), où a représente le nombre de lignes etb représente le nombre de colonnes.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The shape of the object is:")
print df.shape
Ses output est comme suit -
Our object is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
The shape of the object is:
(7, 3)
Taille
Renvoie le nombre d'éléments dans le DataFrame.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The total number of elements in our object is:")
print df.size
Ses output est comme suit -
Our object is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
The total number of elements in our object is:
21
valeurs
Renvoie les données réelles du DataFrame sous la forme d'un NDarray.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The actual data in our data frame is:")
print df.values
Ses output est comme suit -
Our object is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
The actual data in our data frame is:
[[25 'Tom' 4.23]
[26 'James' 3.24]
[25 'Ricky' 3.98]
[23 'Vin' 2.56]
[30 'Steve' 3.2]
[29 'Smith' 4.6]
[23 'Jack' 3.8]]
Tête et queue
Pour afficher un petit échantillon d'un objet DataFrame, utilisez le head() et les méthodes tail (). head() renvoie le premier nlignes (observez les valeurs d'index). Le nombre d'éléments à afficher par défaut est de cinq, mais vous pouvez transmettre un nombre personnalisé.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our data frame is:")
print df
print ("The first two rows of the data frame is:")
print df.head(2)
Ses output est comme suit -
Our data frame is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
The first two rows of the data frame is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
tail() renvoie le dernier nlignes (observez les valeurs d'index). Le nombre d'éléments à afficher par défaut est de cinq, mais vous pouvez transmettre un nombre personnalisé.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our data frame is:")
print df
print ("The last two rows of the data frame is:")
print df.tail(2)
Ses output est comme suit -
Our data frame is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
The last two rows of the data frame is:
Age Name Rating
5 29 Smith 4.6
6 23 Jack 3.8
Un grand nombre de méthodes calculent collectivement des statistiques descriptives et d'autres opérations associées sur DataFrame. La plupart d'entre eux sont des agrégations commesum(), mean(), mais certains d'entre eux, comme sumsum(), produisent un objet de la même taille. De manière générale, ces méthodes prennent unaxisargument, tout comme ndarray. {sum, std, ...}, mais l'axe peut être spécifié par un nom ou un entier
DataFrame - «index» (axe = 0, par défaut), «colonnes» (axe = 1)
Créons un DataFrame et utilisons cet objet tout au long de ce chapitre pour toutes les opérations.
Exemple
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df
Ses output est comme suit -
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
7 34 Lee 3.78
8 40 David 2.98
9 30 Gasper 4.80
10 51 Betina 4.10
11 46 Andres 3.65
somme()
Renvoie la somme des valeurs de l'axe demandé. Par défaut, l'axe est index (axe = 0).
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df.sum()
Ses output est comme suit -
Age 382
Name TomJamesRickyVinSteveSmithJackLeeDavidGasperBe...
Rating 44.92
dtype: object
Chaque colonne individuelle est ajoutée individuellement (les chaînes sont ajoutées).
axe = 1
Cette syntaxe donnera la sortie comme indiqué ci-dessous.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df.sum(1)
Ses output est comme suit -
0 29.23
1 29.24
2 28.98
3 25.56
4 33.20
5 33.60
6 26.80
7 37.78
8 42.98
9 34.80
10 55.10
11 49.65
dtype: float64
signifier()
Renvoie la valeur moyenne
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df.mean()
Ses output est comme suit -
Age 31.833333
Rating 3.743333
dtype: float64
std ()
Renvoie l'écart type de Bressel des colonnes numériques.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df.std()
Ses output est comme suit -
Age 9.232682
Rating 0.661628
dtype: float64
Fonctions et description
Voyons maintenant les fonctions sous Statistiques descriptives dans Python Pandas. Le tableau suivant répertorie les fonctions importantes -
Sr.No. | Fonction | La description |
---|---|---|
1 | compter() | Nombre d'observations non nulles |
2 | somme() | Somme des valeurs |
3 | signifier() | Moyenne des valeurs |
4 | médian() | Médiane des valeurs |
5 | mode() | Mode de valeurs |
6 | std () | Écart type des valeurs |
sept | min () | Valeur minimum |
8 | max () | Valeur maximum |
9 | abdos() | Valeur absolue |
dix | prod () | Produit de valeurs |
11 | jouir () | Somme cumulative |
12 | cumprod () | Produit cumulatif |
Note- Puisque DataFrame est une structure de données hétérogène. Les opérations génériques ne fonctionnent pas avec toutes les fonctions.
Fonctions comme sum(), cumsum()travailler à la fois avec des éléments de données numériques et des chaînes de caractères (ou) sans aucune erreur. Bien quen pratique, les agrégations de caractères ne sont généralement jamais utilisées, ces fonctions ne lèvent aucune exception.
Fonctions comme abs(), cumprod() jette une exception lorsque le DataFrame contient des données de caractère ou de chaîne car ces opérations ne peuvent pas être effectuées.
Synthèse des données
le describe() La fonction calcule un résumé des statistiques relatives aux colonnes DataFrame.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df.describe()
Ses output est comme suit -
Age Rating
count 12.000000 12.000000
mean 31.833333 3.743333
std 9.232682 0.661628
min 23.000000 2.560000
25% 25.000000 3.230000
50% 29.500000 3.790000
75% 35.500000 4.132500
max 51.000000 4.800000
Cette fonction donne le mean, std et IQRvaleurs. Et, la fonction exclut les colonnes de caractères et un résumé donné sur les colonnes numériques.'include'est l'argument utilisé pour transmettre les informations nécessaires concernant les colonnes à prendre en compte pour la synthèse. Prend la liste des valeurs; par défaut, «nombre».
- object - Résume les colonnes String
- number - Résume les colonnes numériques
- all - Résume toutes les colonnes ensemble (ne doit pas le passer comme valeur de liste)
Maintenant, utilisez l'instruction suivante dans le programme et vérifiez la sortie -
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df.describe(include=['object'])
Ses output est comme suit -
Name
count 12
unique 12
top Ricky
freq 1
Maintenant, utilisez l'instruction suivante et vérifiez la sortie -
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df. describe(include='all')
Ses output est comme suit -
Age Name Rating
count 12.000000 12 12.000000
unique NaN 12 NaN
top NaN Ricky NaN
freq NaN 1 NaN
mean 31.833333 NaN 3.743333
std 9.232682 NaN 0.661628
min 23.000000 NaN 2.560000
25% 25.000000 NaN 3.230000
50% 29.500000 NaN 3.790000
75% 35.500000 NaN 4.132500
max 51.000000 NaN 4.800000
Pour appliquer vos propres fonctions ou celles d'une autre bibliothèque à des objets Pandas, vous devez être conscient des trois méthodes importantes. Les méthodes ont été discutées ci-dessous. La méthode appropriée à utiliser dépend de si votre fonction s'attend à fonctionner sur un DataFrame entier, par ligne ou par colonne, ou par élément.
- Application de la fonction de table: pipe ()
- Application de fonction de ligne ou de colonne Wise: apply ()
- Application de fonction par élément: applymap ()
Application de fonction par table
Les opérations personnalisées peuvent être effectuées en passant la fonction et le nombre approprié de paramètres comme arguments de canal. Ainsi, l'opération est effectuée sur l'ensemble du DataFrame.
Par exemple, ajoutez une valeur 2 à tous les éléments du DataFrame. Ensuite,
fonction additionneur
La fonction additionneur ajoute deux valeurs numériques en tant que paramètres et renvoie la somme.
def adder(ele1,ele2):
return ele1+ele2
Nous allons maintenant utiliser la fonction personnalisée pour effectuer des opérations sur le DataFrame.
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.pipe(adder,2)
Voyons le programme complet -
import pandas as pd
import numpy as np
def adder(ele1,ele2):
return ele1+ele2
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.pipe(adder,2)
print df.apply(np.mean)
Ses output est comme suit -
col1 col2 col3
0 2.176704 2.219691 1.509360
1 2.222378 2.422167 3.953921
2 2.241096 1.135424 2.696432
3 2.355763 0.376672 1.182570
4 2.308743 2.714767 2.130288
Application de fonction de ligne ou de colonne Wise
Des fonctions arbitraires peuvent être appliquées le long des axes d'un DataFrame ou d'un Panel à l'aide du apply()qui, comme les méthodes de statistiques descriptives, prend un argument optionnel d'axe. Par défaut, l'opération s'effectue par colonne, en prenant chaque colonne comme un tableau.
Exemple 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.apply(np.mean)
print df.apply(np.mean)
Ses output est comme suit -
col1 -0.288022
col2 1.044839
col3 -0.187009
dtype: float64
En passant axis paramètre, les opérations peuvent être effectuées par ligne.
Exemple 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.apply(np.mean,axis=1)
print df.apply(np.mean)
Ses output est comme suit -
col1 0.034093
col2 -0.152672
col3 -0.229728
dtype: float64
Exemple 3
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.apply(lambda x: x.max() - x.min())
print df.apply(np.mean)
Ses output est comme suit -
col1 -0.167413
col2 -0.370495
col3 -0.707631
dtype: float64
Application de la fonction Element Wise
Toutes les fonctions ne peuvent pas être vectorisées (ni les tableaux NumPy qui renvoient un autre tableau ni aucune valeur), les méthodes applymap() sur DataFrame et analogously map() on Series accepte toute fonction Python prenant une seule valeur et renvoyant une seule valeur.
Exemple 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
# My custom function
df['col1'].map(lambda x:x*100)
print df.apply(np.mean)
Ses output est comme suit -
col1 0.480742
col2 0.454185
col3 0.266563
dtype: float64
Exemple 2
import pandas as pd
import numpy as np
# My custom function
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.applymap(lambda x:x*100)
print df.apply(np.mean)
Ses output est comme suit -
col1 0.395263
col2 0.204418
col3 -0.795188
dtype: float64
Reindexingmodifie les étiquettes de ligne et les étiquettes de colonne d'un DataFrame. Pour réindexer des moyens pour se conformer les données pour correspondre à un ensemble donné d'étiquettes le long d' un axe particulier.
Plusieurs opérations peuvent être accomplies grâce à l'indexation comme -
Réorganisez les données existantes pour qu'elles correspondent à un nouvel ensemble d'étiquettes.
Insérez des marqueurs de valeur manquante (NA) aux emplacements d'étiquette où aucune donnée pour l'étiquette n'existait.
Exemple
import pandas as pd
import numpy as np
N=20
df = pd.DataFrame({
'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
'x': np.linspace(0,stop=N-1,num=N),
'y': np.random.rand(N),
'C': np.random.choice(['Low','Medium','High'],N).tolist(),
'D': np.random.normal(100, 10, size=(N)).tolist()
})
#reindex the DataFrame
df_reindexed = df.reindex(index=[0,2,5], columns=['A', 'C', 'B'])
print df_reindexed
Ses output est comme suit -
A C B
0 2016-01-01 Low NaN
2 2016-01-03 High NaN
5 2016-01-06 Low NaN
Réindexer pour s'aligner avec d'autres objets
Vous souhaiterez peut-être prendre un objet et réindexer ses axes pour qu'ils soient étiquetés de la même manière qu'un autre objet. Prenons l'exemple suivant pour comprendre la même chose.
Exemple
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.random.randn(10,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(7,3),columns=['col1','col2','col3'])
df1 = df1.reindex_like(df2)
print df1
Ses output est comme suit -
col1 col2 col3
0 -2.467652 -1.211687 -0.391761
1 -0.287396 0.522350 0.562512
2 -0.255409 -0.483250 1.866258
3 -1.150467 -0.646493 -0.222462
4 0.152768 -2.056643 1.877233
5 -1.155997 1.528719 -1.343719
6 -1.015606 -1.245936 -0.295275
Note - Ici, le df1 DataFrame est modifié et réindexé comme df2. Les noms de colonne doivent correspondre, sinon NAN sera ajouté pour l'intégralité de l'étiquette de colonne.
Remplissage pendant la réindexation
reindex() prend une méthode de paramètre facultative qui est une méthode de remplissage avec des valeurs comme suit -
pad/ffill - Remplir les valeurs vers l'avant
bfill/backfill - Remplir les valeurs à l'envers
nearest - Remplir à partir des valeurs d'index les plus proches
Exemple
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])
# Padding NAN's
print df2.reindex_like(df1)
# Now Fill the NAN's with preceding Values
print ("Data Frame with Forward Fill:")
print df2.reindex_like(df1,method='ffill')
Ses output est comme suit -
col1 col2 col3
0 1.311620 -0.707176 0.599863
1 -0.423455 -0.700265 1.133371
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
Data Frame with Forward Fill:
col1 col2 col3
0 1.311620 -0.707176 0.599863
1 -0.423455 -0.700265 1.133371
2 -0.423455 -0.700265 1.133371
3 -0.423455 -0.700265 1.133371
4 -0.423455 -0.700265 1.133371
5 -0.423455 -0.700265 1.133371
Note - Les quatre dernières lignes sont rembourrées.
Limites de remplissage lors de la réindexation
L'argument limit fournit un contrôle supplémentaire sur le remplissage lors de la réindexation. Limite spécifie le nombre maximum de correspondances consécutives. Prenons l'exemple suivant pour comprendre la même chose -
Exemple
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])
# Padding NAN's
print df2.reindex_like(df1)
# Now Fill the NAN's with preceding Values
print ("Data Frame with Forward Fill limiting to 1:")
print df2.reindex_like(df1,method='ffill',limit=1)
Ses output est comme suit -
col1 col2 col3
0 0.247784 2.128727 0.702576
1 -0.055713 -0.021732 -0.174577
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
Data Frame with Forward Fill limiting to 1:
col1 col2 col3
0 0.247784 2.128727 0.702576
1 -0.055713 -0.021732 -0.174577
2 -0.055713 -0.021732 -0.174577
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
Note- Attention, seule la 7ème ligne est remplie par la 6ème ligne précédente. Ensuite, les lignes sont laissées telles quelles.
Renommer
La méthode rename () vous permet de renommer un axe en fonction d'un mappage (un dict ou une série) ou une fonction arbitraire.
Prenons l'exemple suivant pour comprendre cela -
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
print df1
print ("After renaming the rows and columns:")
print df1.rename(columns={'col1' : 'c1', 'col2' : 'c2'},
index = {0 : 'apple', 1 : 'banana', 2 : 'durian'})
Ses output est comme suit -
col1 col2 col3
0 0.486791 0.105759 1.540122
1 -0.990237 1.007885 -0.217896
2 -0.483855 -1.645027 -1.194113
3 -0.122316 0.566277 -0.366028
4 -0.231524 -0.721172 -0.112007
5 0.438810 0.000225 0.435479
After renaming the rows and columns:
c1 c2 col3
apple 0.486791 0.105759 1.540122
banana -0.990237 1.007885 -0.217896
durian -0.483855 -1.645027 -1.194113
3 -0.122316 0.566277 -0.366028
4 -0.231524 -0.721172 -0.112007
5 0.438810 0.000225 0.435479
La méthode rename () fournit un inplaceparamètre nommé, qui par défaut est False et copie les données sous-jacentes. Passerinplace=True pour renommer les données en place.
Le comportement de l'itération de base sur les objets Pandas dépend du type. Lors de l'itération sur une série, elle est considérée comme un tableau et une itération de base produit les valeurs. D'autres structures de données, comme DataFrame et Panel, suivent ladict-like convention d'itération sur le keys des objets.
En bref, itération de base (pour i dans l'objet) produit -
Series - valeurs
DataFrame - étiquettes de colonne
Panel - étiquettes d'articles
Itérer un DataFrame
L'itération d'un DataFrame donne des noms de colonnes. Prenons l'exemple suivant pour comprendre la même chose.
import pandas as pd
import numpy as np
N=20
df = pd.DataFrame({
'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
'x': np.linspace(0,stop=N-1,num=N),
'y': np.random.rand(N),
'C': np.random.choice(['Low','Medium','High'],N).tolist(),
'D': np.random.normal(100, 10, size=(N)).tolist()
})
for col in df:
print col
Ses output est comme suit -
A
C
D
x
y
Pour parcourir les lignes du DataFrame, nous pouvons utiliser les fonctions suivantes -
iteritems() - pour itérer sur les paires (clé, valeur)
iterrows() - itérer sur les lignes sous forme de paires (index, série)
itertuples() - itérer sur les lignes comme des tuples nommés
iteritems ()
Itère sur chaque colonne en tant que clé, paire de valeurs avec étiquette en tant que clé et valeur de colonne en tant qu'objet Series.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(4,3),columns=['col1','col2','col3'])
for key,value in df.iteritems():
print key,value
Ses output est comme suit -
col1 0 0.802390
1 0.324060
2 0.256811
3 0.839186
Name: col1, dtype: float64
col2 0 1.624313
1 -1.033582
2 1.796663
3 1.856277
Name: col2, dtype: float64
col3 0 -0.022142
1 -0.230820
2 1.160691
3 -0.830279
Name: col3, dtype: float64
Notez que chaque colonne est itérée séparément en tant que paire clé-valeur dans une série.
iterrows ()
iterrows () renvoie l'itérateur produisant chaque valeur d'index avec une série contenant les données dans chaque ligne.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
for row_index,row in df.iterrows():
print row_index,row
Ses output est comme suit -
0 col1 1.529759
col2 0.762811
col3 -0.634691
Name: 0, dtype: float64
1 col1 -0.944087
col2 1.420919
col3 -0.507895
Name: 1, dtype: float64
2 col1 -0.077287
col2 -0.858556
col3 -0.663385
Name: 2, dtype: float64
3 col1 -1.638578
col2 0.059866
col3 0.493482
Name: 3, dtype: float64
Note - Parce que iterrows()itérer sur les lignes, cela ne conserve pas le type de données sur la ligne. 0,1,2 sont les indices de ligne et col1, col2, col3 sont les indices de colonne.
itertuples ()
La méthode itertuples () retournera un itérateur donnant un tuple nommé pour chaque ligne du DataFrame. Le premier élément du tuple sera la valeur d'index correspondante de la ligne, tandis que les valeurs restantes sont les valeurs de la ligne.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
for row in df.itertuples():
print row
Ses output est comme suit -
Pandas(Index=0, col1=1.5297586201375899, col2=0.76281127433814944, col3=-
0.6346908238310438)
Pandas(Index=1, col1=-0.94408735763808649, col2=1.4209186418359423, col3=-
0.50789517967096232)
Pandas(Index=2, col1=-0.07728664756791935, col2=-0.85855574139699076, col3=-
0.6633852507207626)
Pandas(Index=3, col1=0.65734942534106289, col2=-0.95057710432604969,
col3=0.80344487462316527)
Note- N'essayez pas de modifier un objet pendant l'itération. L'itération est destinée à la lecture et l'itérateur renvoie une copie de l'objet d'origine (une vue), ainsi les modifications ne seront pas reflétées sur l'objet d'origine.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
for index, row in df.iterrows():
row['a'] = 10
print df
Ses output est comme suit -
col1 col2 col3
0 -1.739815 0.735595 -0.295589
1 0.635485 0.106803 1.527922
2 -0.939064 0.547095 0.038585
3 -1.016509 -0.116580 -0.523158
Observez, aucun changement n'est reflété.
Il existe deux types de tri disponibles dans Pandas. Ils sont -
- Par label
- Par valeur réelle
Prenons un exemple avec une sortie.
import pandas as pd
import numpy as np
unsorted_df=pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
mns=['col2','col1'])
print unsorted_df
Ses output est comme suit -
col2 col1
1 -2.063177 0.537527
4 0.142932 -0.684884
6 0.012667 -0.389340
2 -0.548797 1.848743
3 -1.044160 0.837381
5 0.385605 1.300185
9 1.031425 -1.002967
8 -0.407374 -0.435142
0 2.237453 -1.067139
7 -1.445831 -1.701035
Dans unsorted_df, la labels et le valuesne sont pas triés. Voyons comment ils peuvent être triés.
Par étiquette
En utilisant le sort_index()méthode, en passant les arguments de l'axe et l'ordre de tri, DataFrame peut être trié. Par défaut, le tri est effectué sur les étiquettes de ligne dans l'ordre croissant.
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
mns = ['col2','col1'])
sorted_df=unsorted_df.sort_index()
print sorted_df
Ses output est comme suit -
col2 col1
0 0.208464 0.627037
1 0.641004 0.331352
2 -0.038067 -0.464730
3 -0.638456 -0.021466
4 0.014646 -0.737438
5 -0.290761 -1.669827
6 -0.797303 -0.018737
7 0.525753 1.628921
8 -0.567031 0.775951
9 0.060724 -0.322425
Ordre de tri
En passant la valeur booléenne au paramètre croissant, l'ordre du tri peut être contrôlé. Prenons l'exemple suivant pour comprendre la même chose.
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
mns = ['col2','col1'])
sorted_df = unsorted_df.sort_index(ascending=False)
print sorted_df
Ses output est comme suit -
col2 col1
9 0.825697 0.374463
8 -1.699509 0.510373
7 -0.581378 0.622958
6 -0.202951 0.954300
5 -1.289321 -1.551250
4 1.302561 0.851385
3 -0.157915 -0.388659
2 -1.222295 0.166609
1 0.584890 -0.291048
0 0.668444 -0.061294
Trier les colonnes
En passant l'argument axe avec une valeur 0 ou 1, le tri peut être effectué sur les étiquettes de colonne. Par défaut, axis = 0, triez par ligne. Prenons l'exemple suivant pour comprendre la même chose.
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
mns = ['col2','col1'])
sorted_df=unsorted_df.sort_index(axis=1)
print sorted_df
Ses output est comme suit -
col1 col2
1 -0.291048 0.584890
4 0.851385 1.302561
6 0.954300 -0.202951
2 0.166609 -1.222295
3 -0.388659 -0.157915
5 -1.551250 -1.289321
9 0.374463 0.825697
8 0.510373 -1.699509
0 -0.061294 0.668444
7 0.622958 -0.581378
Par valeur
Comme le tri par index, sort_values()est la méthode de tri par valeurs. Il accepte un argument «par» qui utilisera le nom de colonne du DataFrame avec lequel les valeurs doivent être triées.
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
sorted_df = unsorted_df.sort_values(by='col1')
print sorted_df
Ses output est comme suit -
col1 col2
1 1 3
2 1 2
3 1 4
0 2 1
Observez, les valeurs col1 sont triées et la valeur col2 et l'index de ligne respectifs seront modifiés avec col1. Ainsi, ils ne semblent pas triés.
'by' L'argument prend une liste de valeurs de colonne.
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
sorted_df = unsorted_df.sort_values(by=['col1','col2'])
print sorted_df
Ses output est comme suit -
col1 col2
2 1 2
1 1 3
3 1 4
0 2 1
Algorithme de tri
sort_values()fournit une disposition permettant de choisir l'algorithme parmi le tri par fusion, le tri en tas et le tri rapide. Mergesort est le seul algorithme stable.
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
sorted_df = unsorted_df.sort_values(by='col1' ,kind='mergesort')
print sorted_df
Ses output est comme suit -
col1 col2
1 1 3
2 1 2
3 1 4
0 2 1
Dans ce chapitre, nous discuterons des opérations sur les chaînes avec notre série / index de base. Dans les chapitres suivants, nous apprendrons comment appliquer ces fonctions de chaîne sur le DataFrame.
Pandas fournit un ensemble de fonctions de chaîne qui facilitent l'utilisation des données de chaîne. Plus important encore, ces fonctions ignorent (ou excluent) les valeurs / NaN manquantes.
Presque toutes ces méthodes fonctionnent avec des fonctions de chaîne Python (voir: https://docs.python.org/3/library/stdtypes.html#string-methods). Donc, convertissez l'objet série en objet chaîne, puis effectuez l'opération.
Voyons maintenant comment chaque opération se déroule.
Sr.Non | Description de la fonction |
---|---|
1 | lower() Convertit les chaînes de la série / index en minuscules. |
2 | upper() Convertit les chaînes de la série / de l'index en majuscules. |
3 | len() Calcule la longueur de la chaîne (). |
4 | strip() Aide à supprimer les espaces (y compris les sauts de ligne) de chaque chaîne de la série / index des deux côtés. |
5 | split(' ') Divise chaque chaîne avec le modèle donné. |
6 | cat(sep=' ') Concatène les éléments series / index avec un séparateur donné. |
sept | get_dummies() Renvoie le DataFrame avec des valeurs One-Hot Encoded. |
8 | contains(pattern) Renvoie une valeur booléenne True pour chaque élément si la sous-chaîne contient dans l'élément, sinon False. |
9 | replace(a,b) Remplace la valeur a avec la valeur b. |
dix | repeat(value) Répète chaque élément avec un nombre de fois spécifié. |
11 | count(pattern) Renvoie le nombre d'apparitions du motif dans chaque élément. |
12 | startswith(pattern) Renvoie true si l'élément de la série / de l'index commence par le modèle. |
13 | endswith(pattern) Renvoie true si l'élément de la série / de l'index se termine par le modèle. |
14 | find(pattern) Renvoie la première position de la première occurrence du modèle. |
15 | findall(pattern) Renvoie une liste de toutes les occurrences du modèle. |
16 | swapcase Permute le boîtier inférieur / supérieur. |
17 | islower() Vérifie si tous les caractères de chaque chaîne de la série / de l'index sont en minuscules ou non. Renvoie Boolean |
18 | isupper() Vérifie si tous les caractères de chaque chaîne de la série / de l'index sont en majuscules ou non. Renvoie Boolean. |
19 | isnumeric() Vérifie si tous les caractères de chaque chaîne de la série / de l'index sont numériques. Renvoie Boolean. |
Créons maintenant une série et voyons comment fonctionnent toutes les fonctions ci-dessus.
import pandas as pd
import numpy as np
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])
print s
Ses output est comme suit -
0 Tom
1 William Rick
2 John
3 Alber@t
4 NaN
5 1234
6 Steve Smith
dtype: object
inférieur()
import pandas as pd
import numpy as np
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])
print s.str.lower()
Ses output est comme suit -
0 tom
1 william rick
2 john
3 alber@t
4 NaN
5 1234
6 steve smith
dtype: object
plus haut()
import pandas as pd
import numpy as np
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])
print s.str.upper()
Ses output est comme suit -
0 TOM
1 WILLIAM RICK
2 JOHN
3 ALBER@T
4 NaN
5 1234
6 STEVE SMITH
dtype: object
len ()
import pandas as pd
import numpy as np
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])
print s.str.len()
Ses output est comme suit -
0 3.0
1 12.0
2 4.0
3 7.0
4 NaN
5 4.0
6 10.0
dtype: float64
bande()
import pandas as pd
import numpy as np
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s
print ("After Stripping:")
print s.str.strip()
Ses output est comme suit -
0 Tom
1 William Rick
2 John
3 Alber@t
dtype: object
After Stripping:
0 Tom
1 William Rick
2 John
3 Alber@t
dtype: object
split (motif)
import pandas as pd
import numpy as np
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s
print ("Split Pattern:")
print s.str.split(' ')
Ses output est comme suit -
0 Tom
1 William Rick
2 John
3 Alber@t
dtype: object
Split Pattern:
0 [Tom, , , , , , , , , , ]
1 [, , , , , William, Rick]
2 [John]
3 [Alber@t]
dtype: object
chat (sep = motif)
import pandas as pd
import numpy as np
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s.str.cat(sep='_')
Ses output est comme suit -
Tom _ William Rick_John_Alber@t
get_dummies ()
import pandas as pd
import numpy as np
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s.str.get_dummies()
Ses output est comme suit -
William Rick Alber@t John Tom
0 0 0 0 1
1 1 0 0 0
2 0 0 1 0
3 0 1 0 0
contient ()
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s.str.contains(' ')
Ses output est comme suit -
0 True
1 True
2 False
3 False
dtype: bool
remplacer (a, b)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s
print ("After replacing @ with $:") print s.str.replace('@','$')
Ses output est comme suit -
0 Tom
1 William Rick
2 John
3 Alber@t
dtype: object
After replacing @ with $: 0 Tom 1 William Rick 2 John 3 Alber$t
dtype: object
répéter (valeur)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s.str.repeat(2)
Ses output est comme suit -
0 Tom Tom
1 William Rick William Rick
2 JohnJohn
3 Alber@tAlber@t
dtype: object
count (modèle)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print ("The number of 'm's in each string:")
print s.str.count('m')
Ses output est comme suit -
The number of 'm's in each string:
0 1
1 1
2 0
3 0
commence avec (motif)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print ("Strings that start with 'T':")
print s.str. startswith ('T')
Ses output est comme suit -
0 True
1 False
2 False
3 False
dtype: bool
se termine avec (motif)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print ("Strings that end with 't':")
print s.str.endswith('t')
Ses output est comme suit -
Strings that end with 't':
0 False
1 False
2 False
3 True
dtype: bool
trouver (motif)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s.str.find('e')
Ses output est comme suit -
0 -1
1 -1
2 -1
3 3
dtype: int64
"-1" indique qu'un tel modèle n'est pas disponible dans l'élément.
findall (modèle)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s.str.findall('e')
Ses output est comme suit -
0 []
1 []
2 []
3 [e]
dtype: object
La liste nulle ([]) indique qu'aucun modèle de ce type n'est disponible dans l'élément.
casier ()
import pandas as pd
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])
print s.str.swapcase()
Ses output est comme suit -
0 tOM
1 wILLIAM rICK
2 jOHN
3 aLBER@T
dtype: object
est plus bas()
import pandas as pd
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])
print s.str.islower()
Ses output est comme suit -
0 False
1 False
2 False
3 False
dtype: bool
isupper ()
import pandas as pd
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])
print s.str.isupper()
Ses output est comme suit -
0 False
1 False
2 False
3 False
dtype: bool
isnumérique ()
import pandas as pd
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])
print s.str.isnumeric()
Ses output est comme suit -
0 False
1 False
2 False
3 False
dtype: bool
Pandas fournit une API pour personnaliser certains aspects de son comportement, l'affichage est principalement utilisé.
L'API est composée de cinq fonctions pertinentes. Ils sont -
- get_option()
- set_option()
- reset_option()
- describe_option()
- option_context()
Voyons maintenant comment fonctionnent les fonctions.
get_option (paramètre)
get_option prend un seul paramètre et renvoie la valeur donnée dans la sortie ci-dessous -
display.max_rows
Affiche le nombre de valeur par défaut. L'interpréteur lit cette valeur et affiche les lignes avec cette valeur comme limite supérieure à afficher.
import pandas as pd
print pd.get_option("display.max_rows")
Ses output est comme suit -
60
display.max_columns
Affiche le nombre de valeur par défaut. L'interpréteur lit cette valeur et affiche les lignes avec cette valeur comme limite supérieure à afficher.
import pandas as pd
print pd.get_option("display.max_columns")
Ses output est comme suit -
20
Ici, 60 et 20 sont les valeurs par défaut des paramètres de configuration.
set_option (paramètre, valeur)
set_option prend deux arguments et définit la valeur sur le paramètre comme indiqué ci-dessous -
display.max_rows
En utilisant set_option(), nous pouvons modifier le nombre de lignes par défaut à afficher.
import pandas as pd
pd.set_option("display.max_rows",80)
print pd.get_option("display.max_rows")
Ses output est comme suit -
80
display.max_columns
En utilisant set_option(), nous pouvons modifier le nombre de lignes par défaut à afficher.
import pandas as pd
pd.set_option("display.max_columns",30)
print pd.get_option("display.max_columns")
Ses output est comme suit -
30
reset_option (paramètre)
reset_option prend un argument et redéfinit la valeur sur la valeur par défaut.
display.max_rows
En utilisant reset_option (), nous pouvons remettre la valeur au nombre par défaut de lignes à afficher.
import pandas as pd
pd.reset_option("display.max_rows")
print pd.get_option("display.max_rows")
Ses output est comme suit -
60
describe_option (param)
describe_option imprime la description de l'argument.
display.max_rows
En utilisant reset_option (), nous pouvons remettre la valeur au nombre par défaut de lignes à afficher.
import pandas as pd
pd.describe_option("display.max_rows")
Ses output est comme suit -
display.max_rows : int
If max_rows is exceeded, switch to truncate view. Depending on
'large_repr', objects are either centrally truncated or printed as
a summary view. 'None' value means unlimited.
In case python/IPython is running in a terminal and `large_repr`
equals 'truncate' this can be set to 0 and pandas will auto-detect
the height of the terminal and print a truncated object which fits
the screen height. The IPython notebook, IPython qtconsole, or
IDLE do not run in a terminal and hence it is not possible to do
correct auto-detection.
[default: 60] [currently: 60]
option_context ()
Le gestionnaire de contexte option_context est utilisé pour définir l'option dans with statementtemporairement. Les valeurs des options sont restaurées automatiquement lorsque vous quittez lewith block -
display.max_rows
En utilisant option_context (), nous pouvons définir la valeur temporairement.
import pandas as pd
with pd.option_context("display.max_rows",10):
print(pd.get_option("display.max_rows"))
print(pd.get_option("display.max_rows"))
Ses output est comme suit -
10
10
Voyez, la différence entre la première et la deuxième instructions d'impression. La première instruction imprime la valeur définie paroption_context() qui est temporaire dans le with contextlui-même. Après lewith context, la deuxième instruction d'impression imprime la valeur configurée.
Paramètres fréquemment utilisés
Sr.Non | Paramètre et description |
---|---|
1 | display.max_rows Affiche le nombre maximum de lignes à afficher |
2 | 2 display.max_columns Affiche le nombre maximum de colonnes à afficher |
3 | display.expand_frame_repr Affiche les DataFrames pour étirer les pages |
4 | display.max_colwidth Affiche la largeur maximale de la colonne |
5 | display.precision Affiche la précision des nombres décimaux |
Dans ce chapitre, nous allons discuter de la façon de découper et de découper la date et d'obtenir généralement le sous-ensemble d'objets pandas.
Les opérateurs d'indexation Python et NumPy "[]" et l'opérateur d'attribut "." fournissent un accès rapide et facile aux structures de données Pandas dans un large éventail de cas d'utilisation. Cependant, comme le type de données à accéder n'est pas connu à l'avance, l'utilisation directe d'opérateurs standard présente certaines limites d'optimisation. Pour le code de production, nous vous recommandons de tirer parti des méthodes optimisées d'accès aux données pandas expliquées dans ce chapitre.
Pandas prend désormais en charge trois types d'indexation multi-axes; les trois types sont mentionnés dans le tableau suivant -
Sr.Non | Indexation et description |
---|---|
1 | .loc() Basé sur des étiquettes |
2 | .iloc() Basé sur un entier |
3 | .ix() Basé sur les étiquettes et les entiers |
.loc ()
Les pandas fournissent diverses méthodes pour avoir purement label based indexing. Lors du découpage, la limite de départ est également incluse. Les nombres entiers sont des étiquettes valides, mais ils font référence à l'étiquette et non à la position.
.loc() a plusieurs méthodes d'accès comme -
- Une seule étiquette scalaire
- Une liste d'étiquettes
- Un objet de tranche
- Un tableau booléen
locprend deux opérateurs simples / liste / plage séparés par ','. Le premier indique la ligne et le second indique les colonnes.
Exemple 1
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
#select all rows for a specific column
print df.loc[:,'A']
Ses output est comme suit -
a 0.391548
b -0.070649
c -0.317212
d -2.162406
e 2.202797
f 0.613709
g 1.050559
h 1.122680
Name: A, dtype: float64
Exemple 2
# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
# Select all rows for multiple columns, say list[]
print df.loc[:,['A','C']]
Ses output est comme suit -
A C
a 0.391548 0.745623
b -0.070649 1.620406
c -0.317212 1.448365
d -2.162406 -0.873557
e 2.202797 0.528067
f 0.613709 0.286414
g 1.050559 0.216526
h 1.122680 -1.621420
Exemple 3
# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
# Select few rows for multiple columns, say list[]
print df.loc[['a','b','f','h'],['A','C']]
Ses output est comme suit -
A C
a 0.391548 0.745623
b -0.070649 1.620406
f 0.613709 0.286414
h 1.122680 -1.621420
Exemple 4
# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
# Select range of rows for all columns
print df.loc['a':'h']
Ses output est comme suit -
A B C D
a 0.391548 -0.224297 0.745623 0.054301
b -0.070649 -0.880130 1.620406 1.419743
c -0.317212 -1.929698 1.448365 0.616899
d -2.162406 0.614256 -0.873557 1.093958
e 2.202797 -2.315915 0.528067 0.612482
f 0.613709 -0.157674 0.286414 -0.500517
g 1.050559 -2.272099 0.216526 0.928449
h 1.122680 0.324368 -1.621420 -0.741470
Exemple 5
# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
# for getting values with a boolean array
print df.loc['a']>0
Ses output est comme suit -
A False
B True
C False
D False
Name: a, dtype: bool
.iloc ()
Les pandas fournissent diverses méthodes afin d'obtenir une indexation basée uniquement sur des nombres entiers. Comme python et numpy, ce sont0-based indexage.
Les différentes méthodes d'accès sont les suivantes -
- Un nombre entier
- Une liste d'entiers
- Une plage de valeurs
Exemple 1
# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
# select all rows for a specific column
print df.iloc[:4]
Ses output est comme suit -
A B C D
0 0.699435 0.256239 -1.270702 -0.645195
1 -0.685354 0.890791 -0.813012 0.631615
2 -0.783192 -0.531378 0.025070 0.230806
3 0.539042 -1.284314 0.826977 -0.026251
Exemple 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
# Integer slicing
print df.iloc[:4]
print df.iloc[1:5, 2:4]
Ses output est comme suit -
A B C D
0 0.699435 0.256239 -1.270702 -0.645195
1 -0.685354 0.890791 -0.813012 0.631615
2 -0.783192 -0.531378 0.025070 0.230806
3 0.539042 -1.284314 0.826977 -0.026251
C D
1 -0.813012 0.631615
2 0.025070 0.230806
3 0.826977 -0.026251
4 1.423332 1.130568
Exemple 3
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
# Slicing through list of values
print df.iloc[[1, 3, 5], [1, 3]]
print df.iloc[1:3, :]
print df.iloc[:,1:3]
Ses output est comme suit -
B D
1 0.890791 0.631615
3 -1.284314 -0.026251
5 -0.512888 -0.518930
A B C D
1 -0.685354 0.890791 -0.813012 0.631615
2 -0.783192 -0.531378 0.025070 0.230806
B C
0 0.256239 -1.270702
1 0.890791 -0.813012
2 -0.531378 0.025070
3 -1.284314 0.826977
4 -0.460729 1.423332
5 -0.512888 0.581409
6 -1.204853 0.098060
7 -0.947857 0.641358
.ix ()
Outre la base d'étiquettes et de nombres entiers purs, Pandas fournit une méthode hybride pour les sélections et le sous-ensemble de l'objet à l'aide de l'opérateur .ix ().
Exemple 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
# Integer slicing
print df.ix[:4]
Ses output est comme suit -
A B C D
0 0.699435 0.256239 -1.270702 -0.645195
1 -0.685354 0.890791 -0.813012 0.631615
2 -0.783192 -0.531378 0.025070 0.230806
3 0.539042 -1.284314 0.826977 -0.026251
Exemple 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
# Index slicing
print df.ix[:,'A']
Ses output est comme suit -
0 0.699435
1 -0.685354
2 -0.783192
3 0.539042
4 -1.044209
5 -1.415411
6 1.062095
7 0.994204
Name: A, dtype: float64
Utilisation de notations
Obtenir des valeurs de l'objet Pandas avec l'indexation multi-axes utilise la notation suivante -
Objet | Indexeurs | Type de retour |
---|---|---|
Séries | s.loc [indexeur] | Valeur scalaire |
Trame de données | df.loc [index_ligne, index_col] | Objet série |
Panneau | p.loc [item_index, major_index, minor_index] | p.loc [item_index, major_index, minor_index] |
Note − .iloc() & .ix() applique les mêmes options d'indexation et la même valeur de retour.
Voyons maintenant comment chaque opération peut être effectuée sur l'objet DataFrame. Nous utiliserons l'opérateur d'indexation de base '[]' -
Exemple 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print df['A']
Ses output est comme suit -
0 -0.478893
1 0.391931
2 0.336825
3 -1.055102
4 -0.165218
5 -0.328641
6 0.567721
7 -0.759399
Name: A, dtype: float64
Note - Nous pouvons passer une liste de valeurs à [] pour sélectionner ces colonnes.
Exemple 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print df[['A','B']]
Ses output est comme suit -
A B
0 -0.478893 -0.606311
1 0.391931 -0.949025
2 0.336825 0.093717
3 -1.055102 -0.012944
4 -0.165218 1.550310
5 -0.328641 -0.226363
6 0.567721 -0.312585
7 -0.759399 -0.372696
Exemple 3
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print df[2:2]
Ses output est comme suit -
Columns: [A, B, C, D]
Index: []
Accès aux attributs
Les colonnes peuvent être sélectionnées à l'aide de l'opérateur d'attribut «.».
Exemple
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print df.A
Ses output est comme suit -
0 -0.478893
1 0.391931
2 0.336825
3 -1.055102
4 -0.165218
5 -0.328641
6 0.567721
7 -0.759399
Name: A, dtype: float64
Les méthodes statistiques aident à comprendre et à analyser le comportement des données. Nous allons maintenant apprendre quelques fonctions statistiques, que nous pouvons appliquer sur les objets Pandas.
Percent_change
Série, DatFrames et Panel, tous ont la fonction pct_change(). Cette fonction compare chaque élément avec son élément précédent et calcule le pourcentage de changement.
import pandas as pd
import numpy as np
s = pd.Series([1,2,3,4,5,4])
print s.pct_change()
df = pd.DataFrame(np.random.randn(5, 2))
print df.pct_change()
Ses output est comme suit -
0 NaN
1 1.000000
2 0.500000
3 0.333333
4 0.250000
5 -0.200000
dtype: float64
0 1
0 NaN NaN
1 -15.151902 0.174730
2 -0.746374 -1.449088
3 -3.582229 -3.165836
4 15.601150 -1.860434
Par défaut, le pct_change()fonctionne sur des colonnes; si vous souhaitez appliquer la même ligne par ligne, utilisezaxis=1() argument.
Covariance
La covariance est appliquée aux données de série. L'objet Series a une méthode cov pour calculer la covariance entre les objets série. NA sera automatiquement exclu.
Série Cov
import pandas as pd
import numpy as np
s1 = pd.Series(np.random.randn(10))
s2 = pd.Series(np.random.randn(10))
print s1.cov(s2)
Ses output est comme suit -
-0.12978405324
Méthode de covariance lorsqu'elle est appliquée à un DataFrame, calcule cov entre toutes les colonnes.
import pandas as pd
import numpy as np
frame = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
print frame['a'].cov(frame['b'])
print frame.cov()
Ses output est comme suit -
-0.58312921152741437
a b c d e
a 1.780628 -0.583129 -0.185575 0.003679 -0.136558
b -0.583129 1.297011 0.136530 -0.523719 0.251064
c -0.185575 0.136530 0.915227 -0.053881 -0.058926
d 0.003679 -0.523719 -0.053881 1.521426 -0.487694
e -0.136558 0.251064 -0.058926 -0.487694 0.960761
Note - Observez le cov entre a et b colonne dans la première instruction et la même chose est la valeur retournée par cov sur DataFrame.
Corrélation
La corrélation montre la relation linéaire entre deux tableaux de valeurs (séries). Il existe plusieurs méthodes pour calculer la corrélation, comme pearson (par défaut), spearman et kendall.
import pandas as pd
import numpy as np
frame = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
print frame['a'].corr(frame['b'])
print frame.corr()
Ses output est comme suit -
-0.383712785514
a b c d e
a 1.000000 -0.383713 -0.145368 0.002235 -0.104405
b -0.383713 1.000000 0.125311 -0.372821 0.224908
c -0.145368 0.125311 1.000000 -0.045661 -0.062840
d 0.002235 -0.372821 -0.045661 1.000000 -0.403380
e -0.104405 0.224908 -0.062840 -0.403380 1.000000
Si une colonne non numérique est présente dans le DataFrame, elle est automatiquement exclue.
Classement des données
Le classement des données produit un classement pour chaque élément du tableau d'éléments. En cas d'égalité, attribue le rang moyen.
import pandas as pd
import numpy as np
s = pd.Series(np.random.np.random.randn(5), index=list('abcde'))
s['d'] = s['b'] # so there's a tie
print s.rank()
Ses output est comme suit -
a 1.0
b 3.5
c 2.0
d 3.5
e 5.0
dtype: float64
Rank prend facultativement un paramètre croissant qui par défaut est vrai; lorsqu'il est faux, les données sont classées inversement, avec des valeurs plus élevées affectées à un rang plus petit.
Rank prend en charge différentes méthodes de départage, spécifiées avec le paramètre method -
average - rang moyen du groupe à égalité
min - rang le plus bas du groupe
max - rang le plus élevé du groupe
first - les rangs attribués dans l'ordre d'apparition dans le tableau
Pour travailler sur des données numériques, les pandas fournissent quelques variantes telles que les poids roulants, exponentiels et exponentiels pour les statistiques de fenêtre. Parmi ceux-ci sontsum, mean, median, variance, covariance, correlation, etc.
Nous allons maintenant apprendre comment chacun d'entre eux peut être appliqué sur des objets DataFrame.
Fonction .rolling ()
Cette fonction peut être appliquée à une série de données. Spécifie lewindow=n argument et appliquez la fonction statistique appropriée par-dessus.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df.rolling(window=3).mean()
Ses output est comme suit -
A B C D
2000-01-01 NaN NaN NaN NaN
2000-01-02 NaN NaN NaN NaN
2000-01-03 0.434553 -0.667940 -1.051718 -0.826452
2000-01-04 0.628267 -0.047040 -0.287467 -0.161110
2000-01-05 0.398233 0.003517 0.099126 -0.405565
2000-01-06 0.641798 0.656184 -0.322728 0.428015
2000-01-07 0.188403 0.010913 -0.708645 0.160932
2000-01-08 0.188043 -0.253039 -0.818125 -0.108485
2000-01-09 0.682819 -0.606846 -0.178411 -0.404127
2000-01-10 0.688583 0.127786 0.513832 -1.067156
Note - Puisque la taille de la fenêtre est de 3, pour les deux premiers éléments il y a des valeurs nulles et à partir du troisième la valeur sera la moyenne des n, n-1 et n-2éléments. Ainsi, nous pouvons également appliquer diverses fonctions comme mentionné ci-dessus.
Fonction .expanding ()
Cette fonction peut être appliquée à une série de données. Spécifie lemin_periods=n argument et appliquez la fonction statistique appropriée par-dessus.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df.expanding(min_periods=3).mean()
Ses output est comme suit -
A B C D
2000-01-01 NaN NaN NaN NaN
2000-01-02 NaN NaN NaN NaN
2000-01-03 0.434553 -0.667940 -1.051718 -0.826452
2000-01-04 0.743328 -0.198015 -0.852462 -0.262547
2000-01-05 0.614776 -0.205649 -0.583641 -0.303254
2000-01-06 0.538175 -0.005878 -0.687223 -0.199219
2000-01-07 0.505503 -0.108475 -0.790826 -0.081056
2000-01-08 0.454751 -0.223420 -0.671572 -0.230215
2000-01-09 0.586390 -0.206201 -0.517619 -0.267521
2000-01-10 0.560427 -0.037597 -0.399429 -0.376886
Fonction .ewm ()
ewmest appliqué sur une série de données. Spécifiez l'un des com, span,halflifeargument et appliquez la fonction statistique appropriée par-dessus. Il attribue les poids de manière exponentielle.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df.ewm(com=0.5).mean()
Ses output est comme suit -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 0.865131 -0.453626 -1.137961 0.058747
2000-01-03 -0.132245 -0.807671 -0.308308 -1.491002
2000-01-04 1.084036 0.555444 -0.272119 0.480111
2000-01-05 0.425682 0.025511 0.239162 -0.153290
2000-01-06 0.245094 0.671373 -0.725025 0.163310
2000-01-07 0.288030 -0.259337 -1.183515 0.473191
2000-01-08 0.162317 -0.771884 -0.285564 -0.692001
2000-01-09 1.147156 -0.302900 0.380851 -0.607976
2000-01-10 0.600216 0.885614 0.569808 -1.110113
Les fonctions de fenêtre sont principalement utilisées pour trouver les tendances dans les données graphiquement en lissant la courbe. S'il y a beaucoup de variations dans les données quotidiennes et que beaucoup de points de données sont disponibles, alors le prélèvement d'échantillons et le traçage sont une méthode et l'application des calculs de fenêtre et le traçage du graphique sur les résultats est une autre méthode. Par ces méthodes, nous pouvons lisser la courbe ou la tendance.
Une fois le roulement, l'expansion et ewm des objets sont créés, plusieurs méthodes sont disponibles pour effectuer des agrégations sur les données.
Application d'agrégations sur DataFrame
Créons un DataFrame et appliquons-y des agrégations.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r
Ses output est comme suit -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 0.790670 -0.387854 -0.668132 0.267283
2000-01-03 -0.575523 -0.965025 0.060427 -2.179780
2000-01-04 1.669653 1.211759 -0.254695 1.429166
2000-01-05 0.100568 -0.236184 0.491646 -0.466081
2000-01-06 0.155172 0.992975 -1.205134 0.320958
2000-01-07 0.309468 -0.724053 -1.412446 0.627919
2000-01-08 0.099489 -1.028040 0.163206 -1.274331
2000-01-09 1.639500 -0.068443 0.714008 -0.565969
2000-01-10 0.326761 1.479841 0.664282 -1.361169
Rolling [window=3,min_periods=1,center=False,axis=0]
Nous pouvons agréger en passant une fonction à l'ensemble du DataFrame, ou sélectionner une colonne via le standard get item méthode.
Appliquer l'agrégation sur une trame de données entière
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r.aggregate(np.sum)
Ses output est comme suit -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 1.879182 -1.038796 -3.215581 -0.299575
2000-01-03 1.303660 -2.003821 -3.155154 -2.479355
2000-01-04 1.884801 -0.141119 -0.862400 -0.483331
2000-01-05 1.194699 0.010551 0.297378 -1.216695
2000-01-06 1.925393 1.968551 -0.968183 1.284044
2000-01-07 0.565208 0.032738 -2.125934 0.482797
2000-01-08 0.564129 -0.759118 -2.454374 -0.325454
2000-01-09 2.048458 -1.820537 -0.535232 -1.212381
2000-01-10 2.065750 0.383357 1.541496 -3.201469
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 1.879182 -1.038796 -3.215581 -0.299575
2000-01-03 1.303660 -2.003821 -3.155154 -2.479355
2000-01-04 1.884801 -0.141119 -0.862400 -0.483331
2000-01-05 1.194699 0.010551 0.297378 -1.216695
2000-01-06 1.925393 1.968551 -0.968183 1.284044
2000-01-07 0.565208 0.032738 -2.125934 0.482797
2000-01-08 0.564129 -0.759118 -2.454374 -0.325454
2000-01-09 2.048458 -1.820537 -0.535232 -1.212381
2000-01-10 2.065750 0.383357 1.541496 -3.201469
Appliquer l'agrégation sur une seule colonne d'un Dataframe
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r['A'].aggregate(np.sum)
Ses output est comme suit -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 1.879182 -1.038796 -3.215581 -0.299575
2000-01-03 1.303660 -2.003821 -3.155154 -2.479355
2000-01-04 1.884801 -0.141119 -0.862400 -0.483331
2000-01-05 1.194699 0.010551 0.297378 -1.216695
2000-01-06 1.925393 1.968551 -0.968183 1.284044
2000-01-07 0.565208 0.032738 -2.125934 0.482797
2000-01-08 0.564129 -0.759118 -2.454374 -0.325454
2000-01-09 2.048458 -1.820537 -0.535232 -1.212381
2000-01-10 2.065750 0.383357 1.541496 -3.201469
2000-01-01 1.088512
2000-01-02 1.879182
2000-01-03 1.303660
2000-01-04 1.884801
2000-01-05 1.194699
2000-01-06 1.925393
2000-01-07 0.565208
2000-01-08 0.564129
2000-01-09 2.048458
2000-01-10 2.065750
Freq: D, Name: A, dtype: float64
Appliquer l'agrégation sur plusieurs colonnes d'un DataFrame
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r[['A','B']].aggregate(np.sum)
Ses output est comme suit -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 1.879182 -1.038796 -3.215581 -0.299575
2000-01-03 1.303660 -2.003821 -3.155154 -2.479355
2000-01-04 1.884801 -0.141119 -0.862400 -0.483331
2000-01-05 1.194699 0.010551 0.297378 -1.216695
2000-01-06 1.925393 1.968551 -0.968183 1.284044
2000-01-07 0.565208 0.032738 -2.125934 0.482797
2000-01-08 0.564129 -0.759118 -2.454374 -0.325454
2000-01-09 2.048458 -1.820537 -0.535232 -1.212381
2000-01-10 2.065750 0.383357 1.541496 -3.201469
A B
2000-01-01 1.088512 -0.650942
2000-01-02 1.879182 -1.038796
2000-01-03 1.303660 -2.003821
2000-01-04 1.884801 -0.141119
2000-01-05 1.194699 0.010551
2000-01-06 1.925393 1.968551
2000-01-07 0.565208 0.032738
2000-01-08 0.564129 -0.759118
2000-01-09 2.048458 -1.820537
2000-01-10 2.065750 0.383357
Appliquer plusieurs fonctions sur une seule colonne d'un DataFrame
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r['A'].aggregate([np.sum,np.mean])
Ses output est comme suit -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 1.879182 -1.038796 -3.215581 -0.299575
2000-01-03 1.303660 -2.003821 -3.155154 -2.479355
2000-01-04 1.884801 -0.141119 -0.862400 -0.483331
2000-01-05 1.194699 0.010551 0.297378 -1.216695
2000-01-06 1.925393 1.968551 -0.968183 1.284044
2000-01-07 0.565208 0.032738 -2.125934 0.482797
2000-01-08 0.564129 -0.759118 -2.454374 -0.325454
2000-01-09 2.048458 -1.820537 -0.535232 -1.212381
2000-01-10 2.065750 0.383357 1.541496 -3.201469
sum mean
2000-01-01 1.088512 1.088512
2000-01-02 1.879182 0.939591
2000-01-03 1.303660 0.434553
2000-01-04 1.884801 0.628267
2000-01-05 1.194699 0.398233
2000-01-06 1.925393 0.641798
2000-01-07 0.565208 0.188403
2000-01-08 0.564129 0.188043
2000-01-09 2.048458 0.682819
2000-01-10 2.065750 0.688583
Appliquer plusieurs fonctions sur plusieurs colonnes d'un DataFrame
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r[['A','B']].aggregate([np.sum,np.mean])
Ses output est comme suit -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 1.879182 -1.038796 -3.215581 -0.299575
2000-01-03 1.303660 -2.003821 -3.155154 -2.479355
2000-01-04 1.884801 -0.141119 -0.862400 -0.483331
2000-01-05 1.194699 0.010551 0.297378 -1.216695
2000-01-06 1.925393 1.968551 -0.968183 1.284044
2000-01-07 0.565208 0.032738 -2.125934 0.482797
2000-01-08 0.564129 -0.759118 -2.454374 -0.325454
2000-01-09 2.048458 -1.820537 -0.535232 -1.212381
2000-01-10 2.065750 0.383357 1.541496 -3.201469
A B
sum mean sum mean
2000-01-01 1.088512 1.088512 -0.650942 -0.650942
2000-01-02 1.879182 0.939591 -1.038796 -0.519398
2000-01-03 1.303660 0.434553 -2.003821 -0.667940
2000-01-04 1.884801 0.628267 -0.141119 -0.047040
2000-01-05 1.194699 0.398233 0.010551 0.003517
2000-01-06 1.925393 0.641798 1.968551 0.656184
2000-01-07 0.565208 0.188403 0.032738 0.010913
2000-01-08 0.564129 0.188043 -0.759118 -0.253039
2000-01-09 2.048458 0.682819 -1.820537 -0.606846
2000-01-10 2.065750 0.688583 0.383357 0.127786
Appliquer différentes fonctions à différentes colonnes d'un Dataframe
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3, 4),
index = pd.date_range('1/1/2000', periods=3),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r.aggregate({'A' : np.sum,'B' : np.mean})
Ses output est comme suit -
A B C D
2000-01-01 -1.575749 -1.018105 0.317797 0.545081
2000-01-02 -0.164917 -1.361068 0.258240 1.113091
2000-01-03 1.258111 1.037941 -0.047487 0.867371
A B
2000-01-01 -1.575749 -1.018105
2000-01-02 -1.740666 -1.189587
2000-01-03 -0.482555 -0.447078
Les données manquantes sont toujours un problème dans les scénarios de la vie réelle. Des domaines tels que l'apprentissage automatique et l'exploration de données sont confrontés à de graves problèmes de précision de leurs prédictions de modèle en raison de la mauvaise qualité des données due à des valeurs manquantes. Dans ces domaines, le traitement des valeurs manquantes est un objectif majeur pour rendre leurs modèles plus précis et valides.
Quand et pourquoi des données sont-elles manquées?
Prenons une enquête en ligne pour un produit. Souvent, les gens ne partagent pas toutes les informations les concernant. Peu de gens partagent leur expérience, mais pas depuis combien de temps ils utilisent le produit; peu de gens partagent la durée d'utilisation du produit, leur expérience mais pas leurs coordonnées. Ainsi, d'une manière ou d'une autre, une partie des données est toujours manquante, ce qui est très courant en temps réel.
Voyons maintenant comment nous pouvons gérer les valeurs manquantes (disons NA ou NaN) à l'aide de Pandas.
# import the pandas library
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df
Ses output est comme suit -
one two three
a 0.077988 0.476149 0.965836
b NaN NaN NaN
c -0.390208 -0.551605 -2.301950
d NaN NaN NaN
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
g NaN NaN NaN
h 0.085100 0.532791 0.887415
En utilisant la réindexation, nous avons créé un DataFrame avec des valeurs manquantes. Dans la sortie,NaN veux dire Not a Number.
Vérifier les valeurs manquantes
Pour faciliter la détection des valeurs manquantes (et pour différents types de baie), Pandas fournit le isnull() et notnull() fonctions, qui sont également des méthodes sur les objets Series et DataFrame -
Exemple 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df['one'].isnull()
Ses output est comme suit -
a False
b True
c False
d True
e False
f False
g True
h False
Name: one, dtype: bool
Exemple 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df['one'].notnull()
Ses output est comme suit -
a True
b False
c True
d False
e True
f True
g False
h True
Name: one, dtype: bool
Calculs avec des données manquantes
- Lors de la sommation des données, NA sera traité comme zéro
- Si les données sont toutes NA, alors le résultat sera NA
Exemple 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df['one'].sum()
Ses output est comme suit -
2.02357685917
Exemple 2
import pandas as pd
import numpy as np
df = pd.DataFrame(index=[0,1,2,3,4,5],columns=['one','two'])
print df['one'].sum()
Ses output est comme suit -
nan
Nettoyage / remplissage des données manquantes
Pandas fournit diverses méthodes pour nettoyer les valeurs manquantes. La fonction fillna peut «remplir» les valeurs NA avec des données non nulles de plusieurs manières, que nous avons illustrées dans les sections suivantes.
Remplacez NaN par une valeur scalaire
Le programme suivant montre comment remplacer "NaN" par "0".
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3, 3), index=['a', 'c', 'e'],columns=['one',
'two', 'three'])
df = df.reindex(['a', 'b', 'c'])
print df
print ("NaN replaced with '0':")
print df.fillna(0)
Ses output est comme suit -
one two three
a -0.576991 -0.741695 0.553172
b NaN NaN NaN
c 0.744328 -1.735166 1.749580
NaN replaced with '0':
one two three
a -0.576991 -0.741695 0.553172
b 0.000000 0.000000 0.000000
c 0.744328 -1.735166 1.749580
Ici, nous remplissons avec la valeur zéro; à la place, nous pouvons également remplir avec toute autre valeur.
Remplir NA en avant et en arrière
En utilisant les concepts de remplissage discutés dans le chapitre sur la réindexation, nous remplirons les valeurs manquantes.
Sr.Non | Méthode et action |
---|---|
1 | pad/fill Méthodes de remplissage Suivant |
2 | bfill/backfill Méthodes de remplissage vers l'arrière |
Exemple 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.fillna(method='pad')
Ses output est comme suit -
one two three
a 0.077988 0.476149 0.965836
b 0.077988 0.476149 0.965836
c -0.390208 -0.551605 -2.301950
d -0.390208 -0.551605 -2.301950
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
g -0.930230 -0.670473 1.146615
h 0.085100 0.532791 0.887415
Exemple 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.fillna(method='backfill')
Ses output est comme suit -
one two three
a 0.077988 0.476149 0.965836
b -0.390208 -0.551605 -2.301950
c -0.390208 -0.551605 -2.301950
d -2.000303 -0.788201 1.510072
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
g 0.085100 0.532791 0.887415
h 0.085100 0.532791 0.887415
Supprimer les valeurs manquantes
Si vous souhaitez simplement exclure les valeurs manquantes, utilisez le dropna fonction avec le axisargument. Par défaut, axis = 0, c'est-à-dire le long de la ligne, ce qui signifie que si une valeur dans une ligne est NA, alors la ligne entière est exclue.
Exemple 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.dropna()
Ses output est comme suit -
one two three
a 0.077988 0.476149 0.965836
c -0.390208 -0.551605 -2.301950
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
h 0.085100 0.532791 0.887415
Exemple 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.dropna(axis=1)
Ses output est comme suit -
Empty DataFrame
Columns: [ ]
Index: [a, b, c, d, e, f, g, h]
Remplacer les valeurs génériques manquantes (ou)
Plusieurs fois, nous devons remplacer une valeur générique par une valeur spécifique. Nous pouvons y parvenir en appliquant la méthode replace.
Le remplacement de NA par une valeur scalaire est un comportement équivalent du fillna() fonction.
Exemple 1
import pandas as pd
import numpy as np
df = pd.DataFrame({'one':[10,20,30,40,50,2000], 'two':[1000,0,30,40,50,60]})
print df.replace({1000:10,2000:60})
Ses output est comme suit -
one two
0 10 10
1 20 0
2 30 30
3 40 40
4 50 50
5 60 60
Exemple 2
import pandas as pd
import numpy as np
df = pd.DataFrame({'one':[10,20,30,40,50,2000], 'two':[1000,0,30,40,50,60]})
print df.replace({1000:10,2000:60})
Ses output est comme suit -
one two
0 10 10
1 20 0
2 30 30
3 40 40
4 50 50
5 60 60
Tout groupbyl'opération implique l'une des opérations suivantes sur l'objet d'origine. Ils sont -
Splitting L'object
Applying une fonction
Combining Les resultats
Dans de nombreuses situations, nous divisons les données en ensembles et nous appliquons certaines fonctionnalités à chaque sous-ensemble. Dans la fonctionnalité d'application, nous pouvons effectuer les opérations suivantes -
Aggregation - calculer une statistique récapitulative
Transformation - effectuer une opération spécifique au groupe
Filtration - rejet des données avec certaines conditions
Créons maintenant un objet DataFrame et effectuons toutes les opérations dessus -
#import the pandas library
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
print df
Ses output est comme suit -
Points Rank Team Year
0 876 1 Riders 2014
1 789 2 Riders 2015
2 863 2 Devils 2014
3 673 3 Devils 2015
4 741 3 Kings 2014
5 812 4 kings 2015
6 756 1 Kings 2016
7 788 1 Kings 2017
8 694 2 Riders 2016
9 701 4 Royals 2014
10 804 1 Royals 2015
11 690 2 Riders 2017
Diviser les données en groupes
L'objet Pandas peut être divisé en n'importe lequel de leurs objets. Il existe plusieurs façons de diviser un objet comme -
- obj.groupby('key')
- obj.groupby(['key1','key2'])
- obj.groupby(key,axis=1)
Voyons maintenant comment les objets de regroupement peuvent être appliqués à l'objet DataFrame
Exemple
# import the pandas library
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
print df.groupby('Team')
Ses output est comme suit -
<pandas.core.groupby.DataFrameGroupBy object at 0x7fa46a977e50>
Afficher les groupes
# import the pandas library
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
print df.groupby('Team').groups
Ses output est comme suit -
{'Kings': Int64Index([4, 6, 7], dtype='int64'),
'Devils': Int64Index([2, 3], dtype='int64'),
'Riders': Int64Index([0, 1, 8, 11], dtype='int64'),
'Royals': Int64Index([9, 10], dtype='int64'),
'kings' : Int64Index([5], dtype='int64')}
Exemple
Group by avec plusieurs colonnes -
# import the pandas library
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
print df.groupby(['Team','Year']).groups
Ses output est comme suit -
{('Kings', 2014): Int64Index([4], dtype='int64'),
('Royals', 2014): Int64Index([9], dtype='int64'),
('Riders', 2014): Int64Index([0], dtype='int64'),
('Riders', 2015): Int64Index([1], dtype='int64'),
('Kings', 2016): Int64Index([6], dtype='int64'),
('Riders', 2016): Int64Index([8], dtype='int64'),
('Riders', 2017): Int64Index([11], dtype='int64'),
('Devils', 2014): Int64Index([2], dtype='int64'),
('Devils', 2015): Int64Index([3], dtype='int64'),
('kings', 2015): Int64Index([5], dtype='int64'),
('Royals', 2015): Int64Index([10], dtype='int64'),
('Kings', 2017): Int64Index([7], dtype='int64')}
Itérer à travers les groupes
Avec le groupby objet en main, nous pouvons parcourir l'objet comme itertools.obj.
# import the pandas library
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
grouped = df.groupby('Year')
for name,group in grouped:
print name
print group
Ses output est comme suit -
2014
Points Rank Team Year
0 876 1 Riders 2014
2 863 2 Devils 2014
4 741 3 Kings 2014
9 701 4 Royals 2014
2015
Points Rank Team Year
1 789 2 Riders 2015
3 673 3 Devils 2015
5 812 4 kings 2015
10 804 1 Royals 2015
2016
Points Rank Team Year
6 756 1 Kings 2016
8 694 2 Riders 2016
2017
Points Rank Team Year
7 788 1 Kings 2017
11 690 2 Riders 2017
Par défaut, le groupby l'objet a le même nom d'étiquette que le nom de groupe.
Sélectionnez un groupe
En utilisant le get_group() méthode, nous pouvons sélectionner un seul groupe.
# import the pandas library
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
grouped = df.groupby('Year')
print grouped.get_group(2014)
Ses output est comme suit -
Points Rank Team Year
0 876 1 Riders 2014
2 863 2 Devils 2014
4 741 3 Kings 2014
9 701 4 Royals 2014
Agrégations
Une fonction agrégée renvoie une seule valeur agrégée pour chaque groupe. Une fois lagroup by objet est créé, plusieurs opérations d'agrégation peuvent être effectuées sur les données groupées.
Une évidence est l'agrégation via l'agrégat ou équivalent agg méthode -
# import the pandas library
import pandas as pd
import numpy as np
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
grouped = df.groupby('Year')
print grouped['Points'].agg(np.mean)
Ses output est comme suit -
Year
2014 795.25
2015 769.50
2016 725.00
2017 739.00
Name: Points, dtype: float64
Une autre façon de voir la taille de chaque groupe consiste à appliquer la fonction size () -
import pandas as pd
import numpy as np
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
Attribute Access in Python Pandas
grouped = df.groupby('Team')
print grouped.agg(np.size)
Ses output est comme suit -
Points Rank Year
Team
Devils 2 2 2
Kings 3 3 3
Riders 4 4 4
Royals 2 2 2
kings 1 1 1
Application de plusieurs fonctions d'agrégation à la fois
Avec les séries groupées, vous pouvez également passer un list ou dict of functions faire une agrégation avec, et générer DataFrame en sortie -
# import the pandas library
import pandas as pd
import numpy as np
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
grouped = df.groupby('Team')
print grouped['Points'].agg([np.sum, np.mean, np.std])
Ses output est comme suit -
Team sum mean std
Devils 1536 768.000000 134.350288
Kings 2285 761.666667 24.006943
Riders 3049 762.250000 88.567771
Royals 1505 752.500000 72.831998
kings 812 812.000000 NaN
Transformations
La transformation sur un groupe ou une colonne renvoie un objet indexé de la même taille que celui en cours de regroupement. Ainsi, la transformation doit renvoyer un résultat de la même taille que celui d'un bloc de groupe.
# import the pandas library
import pandas as pd
import numpy as np
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
grouped = df.groupby('Team')
score = lambda x: (x - x.mean()) / x.std()*10
print grouped.transform(score)
Ses output est comme suit -
Points Rank Year
0 12.843272 -15.000000 -11.618950
1 3.020286 5.000000 -3.872983
2 7.071068 -7.071068 -7.071068
3 -7.071068 7.071068 7.071068
4 -8.608621 11.547005 -10.910895
5 NaN NaN NaN
6 -2.360428 -5.773503 2.182179
7 10.969049 -5.773503 8.728716
8 -7.705963 5.000000 3.872983
9 -7.071068 7.071068 -7.071068
10 7.071068 -7.071068 7.071068
11 -8.157595 5.000000 11.618950
Filtration
La filtration filtre les données sur un critère défini et renvoie le sous-ensemble de données. lefilter() La fonction est utilisée pour filtrer les données.
import pandas as pd
import numpy as np
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
print df.groupby('Team').filter(lambda x: len(x) >= 3)
Ses output est comme suit -
Points Rank Team Year
0 876 1 Riders 2014
1 789 2 Riders 2015
4 741 3 Kings 2014
6 756 1 Kings 2016
7 788 1 Kings 2017
8 694 2 Riders 2016
11 690 2 Riders 2017
Dans la condition de filtre ci-dessus, nous demandons de renvoyer les équipes qui ont participé trois fois ou plus à l'IPL.
Pandas propose des opérations de jointure en mémoire hautes performances et complètes, idiomatiquement très similaires aux bases de données relationnelles telles que SQL.
Pandas fournit une seule fonction, merge, comme point d'entrée pour toutes les opérations de jointure de base de données standard entre les objets DataFrame -
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True)
Ici, nous avons utilisé les paramètres suivants -
left - Un objet DataFrame.
right - Un autre objet DataFrame.
on- Colonnes (noms) à rejoindre. Doit être trouvé dans les objets DataFrame gauche et droit.
left_on- Colonnes du DataFrame gauche à utiliser comme clés. Il peut s'agir de noms de colonnes ou de tableaux de longueur égale à la longueur du DataFrame.
right_on- Colonnes du bon DataFrame à utiliser comme clés. Il peut s'agir de noms de colonnes ou de tableaux de longueur égale à la longueur du DataFrame.
left_index - Si True,utilisez l'index (étiquettes de ligne) du DataFrame gauche comme clé (s) de jointure. Dans le cas d'un DataFrame avec un MultiIndex (hiérarchique), le nombre de niveaux doit correspondre au nombre de clés de jointure du DataFrame droit.
right_index - Même usage que left_index pour le bon DataFrame.
how- Un parmi «gauche», «droite», «extérieur», «intérieur». La valeur par défaut est interne. Chaque méthode a été décrite ci-dessous.
sort- Trier le résultat DataFrame par les clés de jointure dans l'ordre lexicographique. La valeur par défaut est True, la définition sur False améliorera considérablement les performances dans de nombreux cas.
Créons maintenant deux DataFrames différents et effectuons les opérations de fusion dessus.
# import the pandas library
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame(
{'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print left
print right
Ses output est comme suit -
Name id subject_id
0 Alex 1 sub1
1 Amy 2 sub2
2 Allen 3 sub4
3 Alice 4 sub6
4 Ayoung 5 sub5
Name id subject_id
0 Billy 1 sub2
1 Brian 2 sub4
2 Bran 3 sub3
3 Bryce 4 sub6
4 Betty 5 sub5
Fusionner deux DataFrames sur une clé
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on='id')
Ses output est comme suit -
Name_x id subject_id_x Name_y subject_id_y
0 Alex 1 sub1 Billy sub2
1 Amy 2 sub2 Brian sub4
2 Allen 3 sub4 Bran sub3
3 Alice 4 sub6 Bryce sub6
4 Ayoung 5 sub5 Betty sub5
Fusionner deux DataFrames sur plusieurs clés
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on=['id','subject_id'])
Ses output est comme suit -
Name_x id subject_id Name_y
0 Alice 4 sub6 Bryce
1 Ayoung 5 sub5 Betty
Fusionner en utilisant l'argument «comment»
le howL'argument à fusionner spécifie comment déterminer les clés à inclure dans la table résultante. Si aucune combinaison de touches n'apparaît dans les tables de gauche ou de droite, les valeurs de la table jointe seront NA.
Voici un résumé de la how options et leurs noms équivalents SQL -
Merge, méthode | Equivalent SQL | La description |
---|---|---|
la gauche | JOINTURE EXTERNE GAUCHE | Utiliser les clés de l'objet gauche |
droite | JOINTURE EXTÉRIEURE DROITE | Utiliser les clés de l'objet droit |
extérieur | JOINTURE EXTÉRIEURE COMPLÈTE | Utiliser l'union des clés |
interne | JOINTURE INTERNE | Utiliser l'intersection des clés |
Joint gauche
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='left')
Ses output est comme suit -
Name_x id_x subject_id Name_y id_y
0 Alex 1 sub1 NaN NaN
1 Amy 2 sub2 Billy 1.0
2 Allen 3 sub4 Brian 2.0
3 Alice 4 sub6 Bryce 4.0
4 Ayoung 5 sub5 Betty 5.0
Jointure droite
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='right')
Ses output est comme suit -
Name_x id_x subject_id Name_y id_y
0 Amy 2.0 sub2 Billy 1
1 Allen 3.0 sub4 Brian 2
2 Alice 4.0 sub6 Bryce 4
3 Ayoung 5.0 sub5 Betty 5
4 NaN NaN sub3 Bran 3
Jointure externe
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, how='outer', on='subject_id')
Ses output est comme suit -
Name_x id_x subject_id Name_y id_y
0 Alex 1.0 sub1 NaN NaN
1 Amy 2.0 sub2 Billy 1.0
2 Allen 3.0 sub4 Brian 2.0
3 Alice 4.0 sub6 Bryce 4.0
4 Ayoung 5.0 sub5 Betty 5.0
5 NaN NaN sub3 Bran 3.0
Jointure interne
L'inscription sera effectuée sur l'index. L'opération de jointure honore l'objet sur lequel elle est appelée. Alors,a.join(b) n'est pas égal à b.join(a).
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='inner')
Ses output est comme suit -
Name_x id_x subject_id Name_y id_y
0 Amy 2 sub2 Billy 1
1 Allen 3 sub4 Brian 2
2 Alice 4 sub6 Bryce 4
3 Ayoung 5 sub5 Betty 5
Pandas fournit diverses installations pour se combiner facilement Series, DataFrame, et Panel objets.
pd.concat(objs,axis=0,join='outer',join_axes=None,
ignore_index=False)
objs - Il s'agit d'une séquence ou d'un mappage d'objets Series, DataFrame ou Panel.
axis - {0, 1, ...}, par défaut 0. Il s'agit de l'axe à concaténer.
join- {'interne', 'externe'}, par défaut 'externe'. Comment gérer les index sur d'autres axes. Extérieur pour union et intérieur pour intersection.
ignore_index- booléen, False par défaut. Si True, n'utilisez pas les valeurs d'index sur l'axe de concaténation. L'axe résultant sera étiqueté 0, ..., n - 1.
join_axes- Ceci est la liste des objets Index. Index spécifiques à utiliser pour les autres (n-1) axes au lieu d'exécuter une logique d'ensemble interne / externe.
Concaténation d'objets
le concatfunction fait tout le gros du travail des opérations de concaténation le long d'un axe. Créons différents objets et faisons la concaténation.
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
print pd.concat([one,two])
Ses output est comme suit -
Marks_scored Name subject_id
1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
Supposons que nous voulions associer des clés spécifiques à chacun des morceaux du DataFrame découpé. Nous pouvons le faire en utilisant lekeys argument -
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
print pd.concat([one,two],keys=['x','y'])
Ses output est comme suit -
x 1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
y 1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
L'index de la résultante est dupliqué; chaque index est répété.
Si l'objet résultant doit suivre sa propre indexation, définissez ignore_index à True.
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
print pd.concat([one,two],keys=['x','y'],ignore_index=True)
Ses output est comme suit -
Marks_scored Name subject_id
0 98 Alex sub1
1 90 Amy sub2
2 87 Allen sub4
3 69 Alice sub6
4 78 Ayoung sub5
5 89 Billy sub2
6 80 Brian sub4
7 79 Bran sub3
8 97 Bryce sub6
9 88 Betty sub5
Observez, l'index change complètement et les clés sont également remplacées.
Si deux objets doivent être ajoutés axis=1, puis les nouvelles colonnes seront ajoutées.
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
print pd.concat([one,two],axis=1)
Ses output est comme suit -
Marks_scored Name subject_id Marks_scored Name subject_id
1 98 Alex sub1 89 Billy sub2
2 90 Amy sub2 80 Brian sub4
3 87 Allen sub4 79 Bran sub3
4 69 Alice sub6 97 Bryce sub6
5 78 Ayoung sub5 88 Betty sub5
Concaténation à l'aide d'ajout
Les méthodes d'instance append sur Series et DataFrame sont un raccourci utile pour concaténer. Ces méthodes étaient en fait antérieures à concat. Ils s'enchaînentaxis=0, à savoir l'indice -
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
print one.append(two)
Ses output est comme suit -
Marks_scored Name subject_id
1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
le append la fonction peut également prendre plusieurs objets -
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
print one.append([two,one,two])
Ses output est comme suit -
Marks_scored Name subject_id
1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
Des séries chronologiques
Les pandas fournissent un outil robuste pour le temps de travail avec des données de séries chronologiques, en particulier dans le secteur financier. Lorsque nous travaillons avec des données de séries chronologiques, nous rencontrons fréquemment les éléments suivants:
- Générer une séquence de temps
- Convertir la série chronologique en différentes fréquences
Pandas fournit un ensemble d'outils relativement compact et autonome pour effectuer les tâches ci-dessus.
Obtenir l'heure actuelle
datetime.now() vous donne la date et l'heure actuelles.
import pandas as pd
print pd.datetime.now()
Ses output est comme suit -
2017-05-11 06:10:13.393147
Créer un horodatage
Les données horodatées sont le type le plus élémentaire de données chronologiques qui associent des valeurs à des points dans le temps. Pour les objets pandas, cela signifie utiliser les points dans le temps. Prenons un exemple -
import pandas as pd
print pd.Timestamp('2017-03-01')
Ses output est comme suit -
2017-03-01 00:00:00
Il est également possible de convertir des temps d'époque entiers ou flottants. L'unité par défaut pour ceux-ci est les nanosecondes (puisque c'est ainsi que les horodatages sont stockés). Cependant, les époques sont souvent stockées dans une autre unité qui peut être spécifiée. Prenons un autre exemple
import pandas as pd
print pd.Timestamp(1587687255,unit='s')
Ses output est comme suit -
2020-04-24 00:14:15
Créer une plage de temps
import pandas as pd
print pd.date_range("11:00", "13:30", freq="30min").time
Ses output est comme suit -
[datetime.time(11, 0) datetime.time(11, 30) datetime.time(12, 0)
datetime.time(12, 30) datetime.time(13, 0) datetime.time(13, 30)]
Changer la fréquence du temps
import pandas as pd
print pd.date_range("11:00", "13:30", freq="H").time
Ses output est comme suit -
[datetime.time(11, 0) datetime.time(12, 0) datetime.time(13, 0)]
Conversion en horodatages
Pour convertir une série ou un objet de type liste d'objets de type date, par exemple des chaînes, des époques ou un mélange, vous pouvez utiliser le to_datetimefonction. Une fois passé, cela renvoie une série (avec le même index), tandis qu'unlist-like est converti en DatetimeIndex. Jetez un œil à l'exemple suivant -
import pandas as pd
print pd.to_datetime(pd.Series(['Jul 31, 2009','2010-01-10', None]))
Ses output est comme suit -
0 2009-07-31
1 2010-01-10
2 NaT
dtype: datetime64[ns]
NaT veux dire Not a Time (équivalent à NaN)
Prenons un autre exemple.
import pandas as pd
print pd.to_datetime(['2005/11/23', '2010.12.31', None])
Ses output est comme suit -
DatetimeIndex(['2005-11-23', '2010-12-31', 'NaT'], dtype='datetime64[ns]', freq=None)
En élargissant les séries chronologiques, les fonctionnalités de date jouent un rôle majeur dans l'analyse des données financières. En travaillant avec des données de date, nous rencontrerons fréquemment les éléments suivants:
- Générer une séquence de dates
- Convertir la série de dates en différentes fréquences
Créer une plage de dates
En utilisant le date.range()fonction en spécifiant les périodes et la fréquence, nous pouvons créer la série de dates. Par défaut, la fréquence de la plage est de jours.
import pandas as pd
print pd.date_range('1/1/2011', periods=5)
Ses output est comme suit -
DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'],
dtype='datetime64[ns]', freq='D')
Changer la fréquence de la date
import pandas as pd
print pd.date_range('1/1/2011', periods=5,freq='M')
Ses output est comme suit -
DatetimeIndex(['2011-01-31', '2011-02-28', '2011-03-31', '2011-04-30', '2011-05-31'],
dtype='datetime64[ns]', freq='M')
bdate_range
bdate_range () représente les plages de dates commerciales. Contrairement à date_range (), il exclut le samedi et le dimanche.
import pandas as pd
print pd.date_range('1/1/2011', periods=5)
Ses output est comme suit -
DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'],
dtype='datetime64[ns]', freq='D')
Observez, après le 3 mars, la date saute au 6 mars hors 4 et 5. Vérifiez simplement votre calendrier pour les jours.
Fonctions pratiques telles que date_range et bdate_rangeutilisent une variété d'alias de fréquence. La fréquence par défaut pour date_range est un jour calendaire tandis que la valeur par défaut pour bdate_range est un jour ouvrable.
import pandas as pd
start = pd.datetime(2011, 1, 1)
end = pd.datetime(2011, 1, 5)
print pd.date_range(start, end)
Ses output est comme suit -
DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'],
dtype='datetime64[ns]', freq='D')
Alias de décalage
Un certain nombre d'alias de chaîne sont attribués à des fréquences de séries chronologiques communes utiles. Nous appellerons ces alias des alias décalés.
Alias | La description | Alias | La description |
---|---|---|---|
B | fréquence des jours ouvrables | BQS | fréquence de démarrage du trimestre d'affaires |
ré | fréquence des jours civils | UNE | fréquence de fin annuelle (année) |
W | fréquence hebdomadaire | BA | fréquence de fin d'exercice |
M | fréquence de fin de mois | BAS | fréquence de début d'année commerciale |
SM | fréquence de fin de semestre | BH | fréquence des heures ouvrables |
BM | fréquence de fin de mois ouvrable | H | fréquence horaire |
SP | fréquence de début du mois | T, min | fréquence minutieuse |
SMS | Fréquence de début des SMS par semestre | S | deuxièmement, la fréquence |
BMS | fréquence de début du mois ouvrable | L, ms | millisecondes |
Q | fréquence de fin de trimestre | U, nous | microsecondes |
BQ | fréquence de fin de trimestre | N | nanosecondes |
QS | fréquence de début du trimestre |
Les timedeltas sont des différences de temps, exprimées en unités de différence, par exemple, jours, heures, minutes, secondes. Ils peuvent être à la fois positifs et négatifs.
Nous pouvons créer des objets Timedelta en utilisant divers arguments comme indiqué ci-dessous -
Chaîne
En passant une chaîne littérale, nous pouvons créer un objet timedelta.
import pandas as pd
print pd.Timedelta('2 days 2 hours 15 minutes 30 seconds')
Ses output est comme suit -
2 days 02:15:30
Entier
En passant une valeur entière avec l'unité, un argument crée un objet Timedelta.
import pandas as pd
print pd.Timedelta(6,unit='h')
Ses output est comme suit -
0 days 06:00:00
Décalages de données
Les décalages de données tels que: semaines, jours, heures, minutes, secondes, millisecondes, microsecondes, nanosecondes peuvent également être utilisés dans la construction.
import pandas as pd
print pd.Timedelta(days=2)
Ses output est comme suit -
2 days 00:00:00
to_timedelta ()
Utilisation du niveau supérieur pd.to_timedelta, vous pouvez convertir un scalaire, un tableau, une liste ou une série d'un format / valeur timedelta reconnu en un type Timedelta. Il construira Series si l'entrée est une Series, un scalaire si l'entrée est de type scalaire, sinon produira unTimedeltaIndex.
import pandas as pd
print pd.Timedelta(days=2)
Ses output est comme suit -
2 days 00:00:00
Opérations
Vous pouvez opérer sur Series / DataFrames et construire timedelta64[ns] Série à travers des opérations de soustraction sur datetime64[ns] Série ou horodatage.
Créons maintenant un DataFrame avec des objets Timedelta et datetime et effectuons des opérations arithmétiques dessus -
import pandas as pd
s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))
td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ])
df = pd.DataFrame(dict(A = s, B = td))
print df
Ses output est comme suit -
A B
0 2012-01-01 0 days
1 2012-01-02 1 days
2 2012-01-03 2 days
Opérations d'addition
import pandas as pd
s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))
td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ])
df = pd.DataFrame(dict(A = s, B = td))
df['C']=df['A']+df['B']
print df
Ses output est comme suit -
A B C
0 2012-01-01 0 days 2012-01-01
1 2012-01-02 1 days 2012-01-03
2 2012-01-03 2 days 2012-01-05
Opération de soustraction
import pandas as pd
s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))
td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ])
df = pd.DataFrame(dict(A = s, B = td))
df['C']=df['A']+df['B']
df['D']=df['C']+df['B']
print df
Ses output est comme suit -
A B C D
0 2012-01-01 0 days 2012-01-01 2012-01-01
1 2012-01-02 1 days 2012-01-03 2012-01-04
2 2012-01-03 2 days 2012-01-05 2012-01-07
Souvent en temps réel, les données incluent les colonnes de texte, qui sont répétitives. Les fonctionnalités telles que le sexe, le pays et les codes sont toujours répétitives. Voici les exemples de données catégorielles.
Les variables catégorielles ne peuvent prendre qu'un nombre limité et généralement fixe de valeurs possibles. Outre la longueur fixe, les données catégorielles peuvent avoir un ordre mais ne peuvent pas effectuer d'opérations numériques. Les catégories sont un type de données Pandas.
Le type de données catégorielles est utile dans les cas suivants -
Variable chaîne constituée de quelques valeurs différentes seulement. La conversion d'une telle variable chaîne en une variable catégorielle économisera de la mémoire.
L'ordre lexical d'une variable n'est pas le même que l'ordre logique («un», «deux», «trois»). En convertissant en un catégoriel et en spécifiant un ordre sur les catégories, le tri et min / max utiliseront l'ordre logique au lieu de l'ordre lexical.
Pour signaler aux autres bibliothèques Python que cette colonne doit être traitée comme une variable catégorielle (par exemple pour utiliser des méthodes statistiques ou des types de tracé appropriés).
Création d'objets
Un objet catégoriel peut être créé de plusieurs manières. Les différentes manières ont été décrites ci-dessous -
Catégorie
En spécifiant le dtype comme "category" dans la création d'objets pandas.
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
print s
Ses output est comme suit -
0 a
1 b
2 c
3 a
dtype: category
Categories (3, object): [a, b, c]
Le nombre d'éléments transmis à l'objet série est de quatre, mais les catégories ne sont que de trois. Observez la même chose dans les catégories de sortie.
pd.Catégorique
En utilisant le constructeur catégorique pandas standard, nous pouvons créer un objet de catégorie.
pandas.Categorical(values, categories, ordered)
Prenons un exemple -
import pandas as pd
cat = pd.Categorical(['a', 'b', 'c', 'a', 'b', 'c'])
print cat
Ses output est comme suit -
[a, b, c, a, b, c]
Categories (3, object): [a, b, c]
Prenons un autre exemple -
import pandas as pd
cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'])
print cat
Ses output est comme suit -
[a, b, c, a, b, c, NaN]
Categories (3, object): [c, b, a]
Ici, le deuxième argument signifie les catégories. Ainsi, toute valeur qui n'est pas présente dans les catégories sera traitée commeNaN.
Maintenant, jetez un œil à l'exemple suivant -
import pandas as pd
cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'],ordered=True)
print cat
Ses output est comme suit -
[a, b, c, a, b, c, NaN]
Categories (3, object): [c < b < a]
Logiquement, la commande signifie que, a est supérieur à b et b est supérieur à c.
La description
En utilisant le .describe() commande sur les données catégorielles, nous obtenons une sortie similaire à un Series ou DataFrame du type chaîne.
import pandas as pd
import numpy as np
cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
df = pd.DataFrame({"cat":cat, "s":["a", "c", "c", np.nan]})
print df.describe()
print df["cat"].describe()
Ses output est comme suit -
cat s
count 3 3
unique 2 2
top c c
freq 2 2
count 3
unique 2
top c
freq 2
Name: cat, dtype: object
Obtenez les propriétés de la catégorie
obj.cat.categories commande est utilisée pour obtenir le categories of the object.
import pandas as pd
import numpy as np
s = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print s.categories
Ses output est comme suit -
Index([u'b', u'a', u'c'], dtype='object')
obj.ordered La commande est utilisée pour obtenir l'ordre de l'objet.
import pandas as pd
import numpy as np
cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print cat.ordered
Ses output est comme suit -
False
La fonction retournée false car nous n'avons spécifié aucune commande.
Renommer les catégories
Le changement de nom des catégories s'effectue en attribuant de nouvelles valeurs au series.cat.categoriespropriété series.cat.categories.
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
s.cat.categories = ["Group %s" % g for g in s.cat.categories]
print s.cat.categories
Ses output est comme suit -
Index([u'Group a', u'Group b', u'Group c'], dtype='object')
Catégories initiales [a,b,c] sont mis à jour par le s.cat.categories propriété de l'objet.
Ajout de nouvelles catégories
En utilisant la méthode Categorical.add.categories (), de nouvelles catégories peuvent être ajoutées.
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
s = s.cat.add_categories([4])
print s.cat.categories
Ses output est comme suit -
Index([u'a', u'b', u'c', 4], dtype='object')
Suppression de catégories
En utilisant le Categorical.remove_categories() méthode, les catégories indésirables peuvent être supprimées.
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
print ("Original object:")
print s
print ("After removal:")
print s.cat.remove_categories("a")
Ses output est comme suit -
Original object:
0 a
1 b
2 c
3 a
dtype: category
Categories (3, object): [a, b, c]
After removal:
0 NaN
1 b
2 c
3 NaN
dtype: category
Categories (2, object): [b, c]
Comparaison des données catégoriques
La comparaison des données catégorielles avec d'autres objets est possible dans trois cas -
comparer l'égalité (== et! =) à un objet de type liste (liste, série, tableau, ...) de même longueur que les données catégorielles.
toutes les comparaisons (==,! =,>,> =, <et <=) de données catégorielles à une autre série catégorielle, lorsqu'elles sont ordonnées == True et les catégories sont les mêmes.
toutes les comparaisons d'une donnée catégorielle à un scalaire.
Jetez un œil à l'exemple suivant -
import pandas as pd
cat = pd.Series([1,2,3]).astype("category", categories=[1,2,3], ordered=True)
cat1 = pd.Series([2,2,2]).astype("category", categories=[1,2,3], ordered=True)
print cat>cat1
Ses output est comme suit -
0 False
1 False
2 True
dtype: bool
Tracé de base: tracé
Cette fonctionnalité sur Series et DataFrame n'est qu'un simple wrapper autour du matplotlib libraries plot() méthode.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10,4),index=pd.date_range('1/1/2000',
periods=10), columns=list('ABCD'))
df.plot()
Ses output est comme suit -
Si l'index se compose de dates, il appelle gct().autofmt_xdate() pour formater l'axe des x comme indiqué dans l'illustration ci-dessus.
Nous pouvons tracer une colonne par rapport à une autre en utilisant le x et y mots clés.
Les méthodes de traçage autorisent une poignée de styles de tracé autres que le tracé linéaire par défaut. Ces méthodes peuvent être fournies comme argument de mot-clé kind pourplot(). Ceux-ci comprennent -
- bar ou barh pour les parcelles à barres
- hist pour l'histogramme
- boîte pour boxplot
- 'zone' pour les parcelles de surface
- 'scatter' pour les nuages de points
Bar Plot
Voyons maintenant ce qu'est un Bar Plot en en créant un. Un graphique à barres peut être créé de la manière suivante -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d')
df.plot.bar()
Ses output est comme suit -
Pour produire un graphique à barres empilées, pass stacked=True -
import pandas as pd
df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d')
df.plot.bar(stacked=True)
Ses output est comme suit -
Pour obtenir des graphiques à barres horizontales, utilisez le barh méthode -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d')
df.plot.barh(stacked=True)
Ses output est comme suit -
Histogrammes
Les histogrammes peuvent être tracés à l'aide de plot.hist()méthode. Nous pouvons spécifier le nombre de bacs.
import pandas as pd
import numpy as np
df = pd.DataFrame({'a':np.random.randn(1000)+1,'b':np.random.randn(1000),'c':
np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])
df.plot.hist(bins=20)
Ses output est comme suit -
Pour tracer différents histogrammes pour chaque colonne, utilisez le code suivant -
import pandas as pd
import numpy as np
df=pd.DataFrame({'a':np.random.randn(1000)+1,'b':np.random.randn(1000),'c':
np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])
df.diff.hist(bins=20)
Ses output est comme suit -
Boîtes à moustaches
Boxplot peut être dessiné appelant Series.box.plot() et DataFrame.box.plot(), ou DataFrame.boxplot() pour visualiser la distribution des valeurs dans chaque colonne.
Par exemple, voici un boxplot représentant cinq essais de 10 observations d'une variable aléatoire uniforme sur [0,1).
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
df.plot.box()
Ses output est comme suit -
Tracé de zone
Le tracé de surface peut être créé à l'aide du Series.plot.area() ou la DataFrame.plot.area() méthodes.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df.plot.area()
Ses output est comme suit -
Nuage de points
Le nuage de points peut être créé à l'aide du DataFrame.plot.scatter() méthodes.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])
df.plot.scatter(x='a', y='b')
Ses output est comme suit -
Diagramme circulaire
Le graphique à secteurs peut être créé à l'aide du DataFrame.plot.pie() méthode.
import pandas as pd
import numpy as np
df = pd.DataFrame(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], columns=['x'])
df.plot.pie(subplots=True)
Ses output est comme suit -
le Pandas I/O API est un ensemble de fonctions de lecteur de haut niveau accessibles comme pd.read_csv() qui renvoient généralement un objet Pandas.
Les deux fonctions performantes de lecture des fichiers texte (ou des fichiers plats) sont read_csv() et read_table(). Ils utilisent tous les deux le même code d'analyse pour convertir intelligemment les données tabulaires en unDataFrame objet -
pandas.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer',
names=None, index_col=None, usecols=None
pandas.read_csv(filepath_or_buffer, sep='\t', delimiter=None, header='infer',
names=None, index_col=None, usecols=None
Voici comment le csv les données du fichier ressemblent à -
S.No,Name,Age,City,Salary
1,Tom,28,Toronto,20000
2,Lee,32,HongKong,3000
3,Steven,43,Bay Area,8300
4,Ram,38,Hyderabad,3900
Enregistrez ces données sous temp.csv et mener des opérations dessus.
S.No,Name,Age,City,Salary
1,Tom,28,Toronto,20000
2,Lee,32,HongKong,3000
3,Steven,43,Bay Area,8300
4,Ram,38,Hyderabad,3900
Enregistrez ces données sous temp.csv et mener des opérations dessus.
read.csv
read.csv lit les données des fichiers csv et crée un objet DataFrame.
import pandas as pd
df=pd.read_csv("temp.csv")
print df
Ses output est comme suit -
S.No Name Age City Salary
0 1 Tom 28 Toronto 20000
1 2 Lee 32 HongKong 3000
2 3 Steven 43 Bay Area 8300
3 4 Ram 38 Hyderabad 3900
index personnalisé
Ceci spécifie une colonne dans le fichier csv pour personnaliser l'index à l'aide de index_col.
import pandas as pd
df=pd.read_csv("temp.csv",index_col=['S.No'])
print df
Ses output est comme suit -
S.No Name Age City Salary
1 Tom 28 Toronto 20000
2 Lee 32 HongKong 3000
3 Steven 43 Bay Area 8300
4 Ram 38 Hyderabad 3900
Convertisseurs
dtype des colonnes peuvent être passées comme dict.
import pandas as pd
df = pd.read_csv("temp.csv", dtype={'Salary': np.float64})
print df.dtypes
Ses output est comme suit -
S.No int64
Name object
Age int64
City object
Salary float64
dtype: object
Par défaut, le dtype de la colonne Salaire est int, mais le résultat le montre comme float car nous avons explicitement casté le type.
Ainsi, les données ressemblent à float -
S.No Name Age City Salary
0 1 Tom 28 Toronto 20000.0
1 2 Lee 32 HongKong 3000.0
2 3 Steven 43 Bay Area 8300.0
3 4 Ram 38 Hyderabad 3900.0
header_names
Spécifiez les noms de l'en-tête à l'aide de l'argument names.
import pandas as pd
df=pd.read_csv("temp.csv", names=['a', 'b', 'c','d','e'])
print df
Ses output est comme suit -
a b c d e
0 S.No Name Age City Salary
1 1 Tom 28 Toronto 20000
2 2 Lee 32 HongKong 3000
3 3 Steven 43 Bay Area 8300
4 4 Ram 38 Hyderabad 3900
Remarquez que les noms d'en-tête sont ajoutés avec les noms personnalisés, mais l'en-tête du fichier n'a pas été supprimé. Maintenant, nous utilisons l'argument d'en-tête pour supprimer cela.
Si l'en-tête se trouve dans une ligne autre que la première, transmettez le numéro de ligne à l'en-tête. Cela sautera les lignes précédentes.
import pandas as pd
df=pd.read_csv("temp.csv",names=['a','b','c','d','e'],header=0)
print df
Ses output est comme suit -
a b c d e
0 S.No Name Age City Salary
1 1 Tom 28 Toronto 20000
2 2 Lee 32 HongKong 3000
3 3 Steven 43 Bay Area 8300
4 4 Ram 38 Hyderabad 3900
skiprows
skiprows ignore le nombre de lignes spécifié.
import pandas as pd
df=pd.read_csv("temp.csv", skiprows=2)
print df
Ses output est comme suit -
2 Lee 32 HongKong 3000
0 3 Steven 43 Bay Area 8300
1 4 Ram 38 Hyderabad 3900
Les objets épars sont «compressés» lorsqu'une donnée correspondant à une valeur spécifique (NaN / valeur manquante, bien que n'importe quelle valeur puisse être choisie) est omise. Un objet SparseIndex spécial suit où les données ont été «sparsifiées». Cela aura beaucoup plus de sens dans un exemple. Toutes les structures de données Pandas standard appliquent leto_sparse méthode -
import pandas as pd
import numpy as np
ts = pd.Series(np.random.randn(10))
ts[2:-2] = np.nan
sts = ts.to_sparse()
print sts
Ses output est comme suit -
0 -0.810497
1 -1.419954
2 NaN
3 NaN
4 NaN
5 NaN
6 NaN
7 NaN
8 0.439240
9 -1.095910
dtype: float64
BlockIndex
Block locations: array([0, 8], dtype=int32)
Block lengths: array([2, 2], dtype=int32)
Les objets rares existent pour des raisons d'efficacité de la mémoire.
Supposons maintenant que vous ayez un grand NA DataFrame et exécutez le code suivant -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10000, 4))
df.ix[:9998] = np.nan
sdf = df.to_sparse()
print sdf.density
Ses output est comme suit -
0.0001
Tout objet épars peut être reconverti en forme dense standard en appelant to_dense -
import pandas as pd
import numpy as np
ts = pd.Series(np.random.randn(10))
ts[2:-2] = np.nan
sts = ts.to_sparse()
print sts.to_dense()
Ses output est comme suit -
0 -0.810497
1 -1.419954
2 NaN
3 NaN
4 NaN
5 NaN
6 NaN
7 NaN
8 0.439240
9 -1.095910
dtype: float64
Dtypes clairsemés
Les données éparses doivent avoir le même dtype que leur représentation dense. Actuellement,float64, int64 et booldtypessont pris en charge. Selon l'originaldtype, fill_value default changements -
float64 - np.nan
int64 - 0
bool - Faux
Exécutons le code suivant pour comprendre la même chose -
import pandas as pd
import numpy as np
s = pd.Series([1, np.nan, np.nan])
print s
s.to_sparse()
print s
Ses output est comme suit -
0 1.0
1 NaN
2 NaN
dtype: float64
0 1.0
1 NaN
2 NaN
dtype: float64
Les mises en garde signifie avertissement et gotcha signifie un problème invisible.
Utilisation de la déclaration If / Truth avec les pandas
Pandas suit la convention numpy de générer une erreur lorsque vous essayez de convertir quelque chose en bool. Cela se produit dans unif ou when en utilisant les opérations booléennes, et, or, ou not. On ne sait pas quel devrait être le résultat. Doit-il être vrai parce que ce n'est pas une longueur nulle? False parce qu'il y a des valeurs False? Ce n'est pas clair, donc à la place, Pandas soulève unValueError -
import pandas as pd
if pd.Series([False, True, False]):
print 'I am True'
Ses output est comme suit -
ValueError: The truth value of a Series is ambiguous.
Use a.empty, a.bool() a.item(),a.any() or a.all().
Dans ifcondition, on ne sait pas quoi en faire. L'erreur suggère s'il faut utiliser unNone ou any of those.
import pandas as pd
if pd.Series([False, True, False]).any():
print("I am any")
Ses output est comme suit -
I am any
Pour évaluer des objets pandas à un seul élément dans un contexte booléen, utilisez la méthode .bool() -
import pandas as pd
print pd.Series([True]).bool()
Ses output est comme suit -
True
Booléen au niveau du bit
Opérateurs booléens au niveau du bit comme == et != retournera une série booléenne, ce qui est presque toujours ce qui est requis de toute façon.
import pandas as pd
s = pd.Series(range(5))
print s==4
Ses output est comme suit -
0 False
1 False
2 False
3 False
4 True
dtype: bool
isin Operation
Cela renvoie une série booléenne indiquant si chaque élément de la série est exactement contenu dans la séquence de valeurs transmise.
import pandas as pd
s = pd.Series(list('abc'))
s = s.isin(['a', 'c', 'e'])
print s
Ses output est comme suit -
0 True
1 False
2 True
dtype: bool
Réindexation vs ix Gotcha
De nombreux utilisateurs se retrouveront à utiliser le ix indexing capabilities comme moyen concis de sélectionner des données à partir d'un objet Pandas -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))
print df
print df.ix[['b', 'c', 'e']]
Ses output est comme suit -
one two three four
a -1.582025 1.335773 0.961417 -1.272084
b 1.461512 0.111372 -0.072225 0.553058
c -1.240671 0.762185 1.511936 -0.630920
d -2.380648 -0.029981 0.196489 0.531714
e 1.846746 0.148149 0.275398 -0.244559
f -1.842662 -0.933195 2.303949 0.677641
one two three four
b 1.461512 0.111372 -0.072225 0.553058
c -1.240671 0.762185 1.511936 -0.630920
e 1.846746 0.148149 0.275398 -0.244559
Ceci est bien entendu tout à fait équivalent dans ce cas à l'utilisation du reindex méthode -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))
print df
print df.reindex(['b', 'c', 'e'])
Ses output est comme suit -
one two three four
a 1.639081 1.369838 0.261287 -1.662003
b -0.173359 0.242447 -0.494384 0.346882
c -0.106411 0.623568 0.282401 -0.916361
d -1.078791 -0.612607 -0.897289 -1.146893
e 0.465215 1.552873 -1.841959 0.329404
f 0.966022 -0.190077 1.324247 0.678064
one two three four
b -0.173359 0.242447 -0.494384 0.346882
c -0.106411 0.623568 0.282401 -0.916361
e 0.465215 1.552873 -1.841959 0.329404
Certains pourraient conclure que ix et reindexsont 100% équivalents sur cette base. Ceci est vrai sauf dans le cas de l'indexation d'entiers. Par exemple, l'opération ci-dessus peut également être exprimée par -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))
print df
print df.ix[[1, 2, 4]]
print df.reindex([1, 2, 4])
Ses output est comme suit -
one two three four
a -1.015695 -0.553847 1.106235 -0.784460
b -0.527398 -0.518198 -0.710546 -0.512036
c -0.842803 -1.050374 0.787146 0.205147
d -1.238016 -0.749554 -0.547470 -0.029045
e -0.056788 1.063999 -0.767220 0.212476
f 1.139714 0.036159 0.201912 0.710119
one two three four
b -0.527398 -0.518198 -0.710546 -0.512036
c -0.842803 -1.050374 0.787146 0.205147
e -0.056788 1.063999 -0.767220 0.212476
one two three four
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
4 NaN NaN NaN NaN
Il est important de se rappeler que reindex is strict label indexing only. Cela peut conduire à des résultats potentiellement surprenants dans les cas pathologiques où un index contient, par exemple, des entiers et des chaînes.
Étant donné que de nombreux utilisateurs potentiels de Pandas ont une certaine familiarité avec SQL, cette page est destinée à fournir des exemples de la manière dont diverses opérations SQL peuvent être effectuées à l'aide de pandas.
import pandas as pd
url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'
tips=pd.read_csv(url)
print tips.head()
Ses output est comme suit -
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
SÉLECTIONNER
En SQL, la sélection se fait à l'aide d'une liste de colonnes séparées par des virgules que vous sélectionnez (ou d'un * pour sélectionner toutes les colonnes) -
SELECT total_bill, tip, smoker, time
FROM tips
LIMIT 5;
Avec Pandas, la sélection des colonnes se fait en passant une liste de noms de colonnes à votre DataFrame -
tips[['total_bill', 'tip', 'smoker', 'time']].head(5)
Vérifions le programme complet -
import pandas as pd
url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'
tips=pd.read_csv(url)
print tips[['total_bill', 'tip', 'smoker', 'time']].head(5)
Ses output est comme suit -
total_bill tip smoker time
0 16.99 1.01 No Dinner
1 10.34 1.66 No Dinner
2 21.01 3.50 No Dinner
3 23.68 3.31 No Dinner
4 24.59 3.61 No Dinner
L'appel du DataFrame sans la liste des noms de colonne affichera toutes les colonnes (semblable à SQL *).
OÙ
Le filtrage en SQL se fait via une clause WHERE.
SELECT * FROM tips WHERE time = 'Dinner' LIMIT 5;
Les DataFrames peuvent être filtrés de plusieurs manières; le plus intuitif est l'utilisation de l'indexation booléenne.
tips[tips['time'] == 'Dinner'].head(5)
Vérifions le programme complet -
import pandas as pd
url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'
tips=pd.read_csv(url)
print tips[tips['time'] == 'Dinner'].head(5)
Ses output est comme suit -
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
L'instruction ci-dessus transmet une série d'objets True / False au DataFrame, renvoyant toutes les lignes avec True.
Par groupe
Cette opération récupère le nombre d'enregistrements dans chaque groupe dans un ensemble de données. Par exemple, une requête nous récupérant le nombre de pourboires laissés par sexe -
SELECT sex, count(*)
FROM tips
GROUP BY sex;
L'équivalent Pandas serait -
tips.groupby('sex').size()
Vérifions le programme complet -
import pandas as pd
url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'
tips=pd.read_csv(url)
print tips.groupby('sex').size()
Ses output est comme suit -
sex
Female 87
Male 157
dtype: int64
N premières rangées
SQL renvoie le top n rows en utilisant LIMIT -
SELECT * FROM tips
LIMIT 5 ;
L'équivalent Pandas serait -
tips.head(5)
Vérifions l'exemple complet -
import pandas as pd
url = 'https://raw.github.com/pandas-dev/pandas/master/pandas/tests/data/tips.csv'
tips=pd.read_csv(url)
tips = tips[['smoker', 'day', 'time']].head(5)
print tips
Ses output est comme suit -
smoker day time
0 No Sun Dinner
1 No Sun Dinner
2 No Sun Dinner
3 No Sun Dinner
4 No Sun Dinner
Ce sont les quelques opérations de base que nous avons comparées, que nous avons apprises dans les chapitres précédents de la bibliothèque Pandas.