Sélectionnez les lignes Pandas en fonction de l'index de la liste

106

J'ai un dataframe df:

   20060930  10.103       NaN     10.103   7.981
   20061231  15.915       NaN     15.915  12.686
   20070331   3.196       NaN      3.196   2.710
   20070630   7.907       NaN      7.907   6.459

Ensuite, je veux sélectionner des lignes avec certains numéros de séquence indiqués dans une liste, supposons que voici [1,3], puis à gauche:

   20061231  15.915       NaN     15.915  12.686
   20070630   7.907       NaN      7.907   6.459

Comment ou quelle fonction peut faire cela?

user2806761
la source

Réponses:

131
List = [1, 3]
df.ix[List]

devrait faire l'affaire! Lorsque j'indexe avec des cadres de données, j'utilise toujours la méthode .ix (). C'est tellement plus facile et plus flexible ...

UPDATE Ce n'est plus la méthode d'indexation acceptée. La ixméthode est obsolète. À utiliser .ilocpour l'indexation basée sur des entiers et .locpour l'indexation basée sur des étiquettes.

Fierté boisée
la source
14
Ceci est maintenant obsolète, .iloc devrait être utilisé pour l'indexation positionnelle
t_warsop
87

vous pouvez également utiliser iloc:

df.iloc[[1,3],:]

Cela ne fonctionnera pas si les index de votre dataframe ne correspondent pas à l'ordre des lignes en raison de calculs antérieurs. Dans ce cas, utilisez:

df.index.isin([1,3])

... comme suggéré dans d'autres réponses.

yemu
la source
61

Une autre façon (bien que ce soit un code plus long) mais c'est plus rapide que les codes ci-dessus. Vérifiez-le en utilisant la fonction% timeit:

df[df.index.isin([1,3])]

PS: vous trouvez la raison

entrez la description de l'image ici

Amruth Lakkavaram
la source
1
utiliser df.index.get_level_values(0).isinpour multiindex
CiaranWelsh
4

Pour les grands ensembles de données, il est efficace en mémoire de lire uniquement les lignes sélectionnées via le skiprowsparamètre.

Exemple

pred = lambda x: x not in [1, 3]
pd.read_csv("data.csv", skiprows=pred, index_col=0, names=...)

Cela va maintenant renvoyer un DataFrame à partir d'un fichier qui ignore toutes les lignes sauf 1 et 3.


Détails

À partir de la documentation :

skiprows : de type liste ou entier ou appelable, par défaut None

...

Si appelable, la fonction appelable sera évaluée par rapport aux index de ligne, renvoyant True si la ligne doit être ignorée et False dans le cas contraire. Un exemple d'argument appelable valide seraitlambda x: x in [0, 2]

Cette fonctionnalité fonctionne dans la version pandas 0.20.0+. Voir également le problème correspondant et un article connexe .

pylang
la source