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)

df = pd.DataFrame({'a': [1, 2, 3, 4, 5], 'b': [6, 7, 8, 9, 0]})

df.sample(3)

  • 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