web-dev-qa-db-fra.com

Vous utilisez .loc avec un MultiIndex dans les pandas?

Est-ce que quelqu'un sait s'il est possible d'utiliser la méthode DataFrame.loc pour sélectionner à partir d'un MultiIndex? J'ai le DataFrame suivant et je voudrais pouvoir accéder aux valeurs situées dans les colonnes 'Dwell', aux indices de ('at', 1), ('at', 3), ('at', 5), etc. (non séquentiel).

J'adorerais pouvoir faire quelque chose comme data.loc[['at',[1,3,5]], 'Dwell'], semblable à la data.loc[[1,3,5], 'Dwell'] syntaxe pour un index régulier (qui renvoie une série de 3 valeurs Dwell).

Mon objectif est de sélectionner un sous-ensemble arbitraire des données, d'effectuer une analyse uniquement sur ce sous-ensemble, puis de mettre à jour les nouvelles valeurs avec les résultats de l'analyse. Je prévois d'utiliser la même syntaxe pour définir de nouvelles valeurs pour ces données, de sorte que les sélecteurs de chaînage ne fonctionneraient pas vraiment dans ce cas.

Voici une tranche du DataFrame avec lequel je travaille:

         Char    Dwell  Flight  ND_Offset  Offset
QGram                                                           
at    0     a      100     120   0.000000       0  
      1     t      180       0   0.108363       5  
      2     a      100     120   0.000000       0 
      3     t      180       0   0.108363       5 
      4     a       20     180   0.000000       0  
      5     t       80     120   0.108363       5
      6     a       20     180   0.000000       0   
      7     t       80     120   0.108363       5  
      8     a       20     180   0.000000       0  
      9     t       80     120   0.108363       5   
      10    a      120     180   0.000000       0  

Merci!

28
kronosapiens

Si vous êtes sur la version 0.14, vous pouvez simplement passer un Tuple à .loc comme ci-dessous:

df.loc[('at', [1,3,4]), 'Dwell']
35
chrisb

Essayez l'indexation cross-section :

In [68]: df.xs('at', level='QGram', drop_level=False).loc[[1,4]]
Out[68]: 
        Char  Dwell  Flight  ND_Offset  Offset
QGram                                         
at    1    t    180       0   0.108363       5
      4    a     20     180   0.000000       0
12
Rolando Max