Slice a Pandas dataframe by an array of indices and column names

dataframe, numpy, pandas, python, slice

Solution

Pandas doesn't support this directly; it could, but the issue is how to specify that you want coordinates rather than different axes, e.g. `df.iloc[[0,1],[0,1]]` means give me the 0 and 1st rows and the 0 and 1st column.

That said, you can do this:

You updated the question and say you want to start with the index values

In [19]: row_indexer = df.index.get_indexer([Period('2011'),Period('2012')])

In [20]: col_indexer = df.columns.get_indexer([0,1])

In [21]: z = np.zeros(df.shape,dtype=bool)

In [22]: z[row_indexer,col_indexer] = True

In [23]: df.where(z)
Out[23]: 
       0   1   2
2011   0 NaN NaN
2012 NaN   4 NaN
2013 NaN NaN NaN

This seems easier though (these are the locations)

In [63]: df.values[[0,1],[0,1]]
Out[63]: array([0, 4])

Or this; as the Period index will be sliced correctly from the strings (don't use integers here)

In [26]: df.loc['2011',0]
Out[26]: 0

In [27]: df.loc['2012',1]
Out[27]: 4

Problem

I'm looking to replicate the behavior of a numpy array with a pandas dataframe. I want to pass an array of indices and column names and get a list of objects that are found in the corresponding index and column name. ``` import pandas as pd import numpy as np ``` In numpy: ``` array=np.array(range(9)).reshape([3,3]) print array print array[[0,1],[0,1]] [[0 1 2] [3 4 5] [6 7 8]] [0 4] ``` In pandas: ``` prng = pd.period_range('1/1/2011', '1/1/2013', freq='A') df=pd.DataFrame(array,index=prng) print df 0 1 2 2011 0 1 2 2012 3 4 5 2013 6 7 8 df[[2011,2012],[0,1]] ``` Expected output: ``` [0 4] ``` How should I slice this dataframe to get it to return the same as numpy?

Original source