Maison >développement back-end >Tutoriel Python >Comment sélectionner efficacement des lignes dans les DataFrames MultiIndex Pandas ?

Comment sélectionner efficacement des lignes dans les DataFrames MultiIndex Pandas ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-12 19:01:16346parcourir

How to Efficiently Select Rows in Pandas MultiIndex DataFrames?

Sélectionner des lignes dans un DataFrame Pandas MultiIndex

Résumé du problème

Étant donné un DataFrame Pandas avec un MultiIndex, comment pouvons-nous sélectionner des lignes en fonction de valeurs spécifiques/ étiquettes dans chaque niveau d'index ?

Découper avec loc

df.loc[key, :]
  • key est un tuple d'étiquettes, une pour chaque niveau d'index.
  • Cela fournit un moyen pratique et concis de sélectionner des lignes en fonction de valeurs spécifiques dans différents niveaux.

Le découpage avec xs

df.xs(level_key, level=level_name, drop_level=True/False)
  • level_key est la clé pour le niveau d'index spécifique.
  • drop_level contrôle si le niveau doit être supprimé du DataFrame résultant.
  • xs est particulièrement utile lors du découpage sur un seul niveau.

Filtrage avec requête

df.query("condition")
  • condition est une expression booléenne qui spécifie le filtrage critères.
  • Prend en charge le filtrage flexible sur plusieurs niveaux d'index.

Utilisation de get_level_values

mask = df.index.get_level_values(level_name).isin(values_list)
selected_rows = df[mask]
  • Crée un masque booléen basé sur les valeurs d'un élément spécifique. niveau d'index.
  • Utile pour les opérations de filtrage plus complexes ou lors du découpage sur plusieurs valeurs.

Exemples

Exemple 1 : Sélection de lignes avec des valeurs spécifiques aux niveaux « un » et « deux » :

# Using loc
selected_rows = df.loc[['a'], ['t', 'u']]

# Using xs
selected_rows = df.xs('a', level='one', drop_level=False)
selected_rows = selected_rows.xs(['t', 'u'], level='two')

# Using query
selected_rows = df.query("one == 'a' and two.isin(['t', 'u'])")

# Using get_level_values
one_mask = df.index.get_level_values('one') == 'a'
two_mask = df.index.get_level_values('two').isin(['t', 'u'])
selected_rows = df[one_mask & two_mask]

Exemple 2 : Filtrage des lignes en fonction d'une inégalité numérique de niveau « deux » :

# Using query
selected_rows = df.query("two > 5")

# Using get_level_values
two_mask = df.index.get_level_values('two') > 5
selected_rows = df[two_mask]

Conseils et considérations

  • Considérez la complexité de l'opération de découpage/filtrage et choisissez la méthode appropriée en conséquence.
  • Pour un découpage simple sur un ou plusieurs niveaux, loc ou xs sont préférés.
  • Pour un filtrage complexe ou pour découper plusieurs valeurs, envisagez d'utiliser query ou get_level_values ​​car ils offrent plus de flexibilité.
  • Faites attention à l'utilisation de pd.IndexSlice pour spécifier des opérations de découpage complexes avec loc.
  • sort_index() peut améliorer les performances pour les grands DataFrames avec des MultiIndex non triés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn