Given lists of indices and columns, one can easily pull out the elements of a pandas DataFrame using the lookup()
method. Is there a way to get the ordered lists of indices and columns from a given data frame (for example, after applying a boolean operation)? To be clear, I want the names of the indices and columns, not just their integer locations.
This is the closest I've come up with, although it's a bit contorted:
In [137]: df = pandas.DataFrame({"a":range(3), "b":range(10,13), "c":range(20,23)}, index=list("ABC"))
In [138]: df
Out[138]:
a b c
A 0 10 20
B 1 11 21
C 2 12 22
In [139]: df % 3 == 0
Out[139]:
a b c
A True False False
B False False True
C False True False
In [140]: numpy.where(df % 3 == 0)
Out[140]: (array([0, 1, 2]), array([0, 2, 1]))
In [141]: iindices, icolumns = numpy.where(df % 3 == 0)
In [142]: indices = df.index[iindices]
In [143]: columns = df.columns[icolumns]
The result I'm looking for:
In [144]: indices, columns
Out[144]:
(Index([u'A', u'B', u'C'], dtype='object'),
Index([u'a', u'c', u'b'], dtype='object'))
Alternate form that's easier to look at by eye:
In [145]: zip(indices, columns)
Out[145]: [('A', 'a'), ('B', 'c'), ('C', 'b')]
(h/t Python - find integer index of rows with NaN in pandas)