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, :]
Copier après la connexion
- 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)
Copier après la connexion
- 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")
Copier après la connexion
- 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]
Copier après la connexion
- 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]
Copier après la connexion
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]
Copier après la connexion
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!