Filtrer et trier des données en python
1- Sélection en fonction de l'indice
Voici une liste x, comment récupérer des valeurs de x de façon sélective en fonction de l'indice ?
x = [2,3,9,6,9,1] ; print(x)
x[3] # L'indice commence à partir de 0 : on ne récupère pas ici la 3ème valeur mais la quatrième
x[3:] # Récupère toutes les valeurs de x de la 4ème à la dernière
x[:-1] # Récupère toutes les valeurs de la 1ère à l'avant-dernière (n - 1)
x[2:-2] # Récupère toutes les valeurs de la 3ème jusqu'à n-2 (avant avant dernière)
Fournir une liste d'indices pour en récupérer les valeurs correspondantes d'une liste
x = [2,3,9,6,9,1]
indices = [0,3,1]
y = [x[i] for i in indices] ; print(y)
Extraire en alternance des valeurs d'une liste
x[1::2] #une valeur sur 2 en partant de l'indice 1
x[2::3] #une valeur sur 3 en partant de l'indice 2
2- Sélection en fonction d'une valeur de la liste - sélection par condition
Supprimer la première valeur correspondante rencontrée
x = [2,3,9,6,9,1]
x.remove(9) # supprime le premier 9 rencontré
y = ["Toto","Gérard","Pascal","Gérard"]
y.remove("Gérard") # supprime le premier "Gérard" rencontré
Chercher des occurrences
x = ["Bateau",2,"Bateau",3]
x.count("Bateau") # Compter les occurrences - Dira bien qu'il y a deux fois "Bateau".
x.index("Bateau") # Donner l'indice de la première occurrence... et seulement de la première !
Récupérer les valeurs d'une liste ou d'une série qui répondent à une plusieurs conditions.
Key words : extraction sélection, filtration de données
Attention, c'est compliqué ! mais c'est faisable. cf. exemple ci-dessous.
# Simulons des valeurs d'âge, poids et sexe
age = [18,19,20]*4 ; poids = [65,72,80,55]*3 ; sexe = ["F","M"]*6
# Exemple, si je voulais récupérer le poids des filles de plus de 19 ans...
c = [poids[i] for i in range(len(poids)) if ((age[i]>=19)&(sexe[i]=="F"))] ; print(c)
Mais il existe une solution simple : je peux faire appel aux séries du module pandas.
Récupérer les indices des valeurs répondant à une condition - équivalent de la fonction which() sous R
x = [1,2,3,4,5,1,2,3,4,6]
x=np.array(x)
np.where(x == 2) # Indices des valeurs de X égales à 2
np.where((x == 2)|(x >4) ) # Indices des valeurs où x = 2 ou est supérieur à 4.
Récupérer l'indice :
np.where(x == 2)[0] # format array
np.where(x == 2)[0].tolist() # format list
Remarque importante : la fonction np.where() ne fonctionne pas au format list. Une conversion avec np.array() est donc nécessaire !
3- Trier une liste de valeurs
Voici trier une liste x ?
y = sorted(x) # Trier x et lui donner un nouveau nom y
x.sort() # Trier x et remplacer x par la nouvelle liste obtenue
Remarque, ces fonctions acceptent un paramètre rev ou reverse : on peut aussi utiliser reverse ci-dessous après tri.
Inverser l'ordre d'une liste
x.reverse()
Trier une liste en fonction de l'ordre de tri d'une autre liste (Ordonner une liste à partir d'une autre liste) - équivalent de la fonction order() sous R.
1. Récupérer l'ordre de tri de la liste x
x = [9,1,6,1]
ordre = sorted(range(len(x)), key=lambda k: x[k])
2. Trier
z = [x[i] for i in ordre]
print(z) # Voici y trié.
4- Extraire des échantillons aléatoires - équivalent de sample() sous R
Avec numpy
Extraction dans une liste simple
x = [1,2,3,4,5,6,7,8,9,10]
import numpy as np
sample = np.random.choice(x, size=None, replace=True, p=None) ; print(sample)
sample = np.random.choice(x, size=3, replace=True, p=None) ; print(sample)
sample = np.random.choice(x, size=3, replace=False, p=None) ; print(sample)
Trier un échantillon d'apprentissage et mettre les autres valeurs non tirées dans un échantillon test : avec des valeurs 2D ou plus
Exemple numpy
x = np.array([1,2,3,4,5,6,7,8,9,10]) ; x=x.reshape(5,2)
indices = range(5)
ind_apprentissage = np.random.choice(indices, size=3, replace=False)
ind_apprentissage = set(ind_apprentissage)
indices = set(indices)
ind_test = list(indices-ind_apprentissage)
ind_apprentissage = list(ind_apprentissage)
indices = list(indices)
apprentissage = x[ind_apprentissage,:]
test = x[ind_test,:]
Avec sklearn
x = [1,2,3,4,5,6]
y = [2,3,5,6,4,3]
# Contruire un échantillon d'apprentissage
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(x,y,test_size=0.2)
# X_train et Y_train servirons à l'apprentissage
# X_test et Y_test servirons au test
4- Vérifier la présence ou l'absence d'une ou plusieurs valeurs dans une liste
# Fonction équivalente du %in% de R
liste = ["A","B","C","D","E","F"]
Acherche = ["B","C","K"]
import numpy as np
np.isin(Acherche,liste)
# Fonction équivalente à %in% dans R
Sortie :
True True False
K n'est donc pas dans la liste.
any( np.isin(Acherche,liste) ) # Il y a donc une valeur de Acherche qui ne se trouve pas dans liste puisque any renvoie True