Using .loc with a MultiIndex in pandas
Solution 1
If you are on version 0.14, you can simply pass a tuple to .loc
as below:
df.loc[('at', [1,3,4]), 'Dwell']
Solution 2
Try the cross-section indexing:
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
Solution 3
In general, MultiIndex keys take the form of tuples. For example:
In [6]: df.loc[('at', 1),'Dwell']
Out[6]: 180
In your case, you would have to pass a list of tuples. For example, the following works as you would expect:
In [7]: df.loc[ [('at', 1),('at', 3),('at', 5)], 'Dwell']
Out[7]:
Dwell
QGram
at 1 180
at 3 180
at 5 80
kronosapiens
Graduate student at Columbia University, studying Machine Learning & related disciplines.
Updated on January 11, 2022Comments
-
kronosapiens over 2 years
Does anyone know if it is possible to use the
DataFrame.loc
method to select from aMultiIndex
? I have the followingDataFrame
and would like to be able to access the values located in theDwell
columns, at the indices of('at', 1)
,('at', 3)
,('at', 5)
, and so on (non-sequential).I'd love to be able to do something like
data.loc[['at',[1,3,5]], 'Dwell']
, similar to thedata.loc[[1,3,5], 'Dwell']
syntax for a regular index (which returns a 3-member series ofDwell
values).My purpose is to select an arbitrary subset of the data, perform some analysis only on that subset, and then update the new values with the results of the analysis. I plan on using the same syntax to set new values for these data, so chaining selectors wouldn't really work in this case.
Here is a slice of the
DataFrame
I'm working with: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
-
physincubus almost 5 yearsThis would be the way that the pandas docs recommend, as slicing with deep indexes can be done with xs: pandas-docs.github.io/pandas-docs-travis/user_guide/…
-
leoschet almost 5 yearsFunny because if instead of a tuple, you pass a list, it does not work properly
-
D.J.Duff about 4 years@leoschet Pandas interprets tuple entries as levels and list entries as items in a level. pandas.pydata.org/pandas-docs/stable/user_guide/… FYI
-
baxx over 3 yearsIs
xs
still recommended? -
amball over 2 years@baxx. Yes,
xs
is still recommended. See pandas.pydata.org/pandas-docs/dev/user_guide/… -
Marioanzas over 2 yearsMore info can be found here: pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html