给定索引和列的列表,可以使用lookup()
方法轻松提取出熊猫DataFrame的元素。有没有办法从给定的数据帧中获取索引和列的有序列表(例如,在应用布尔操作之后)?需要明确的是,我想要索引和列的名称,而不仅仅是它们的整数位置。
这是我想出的最接近的结果,尽管有些曲解:
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]
我正在寻找的结果:
In [144]: indices, columns
Out[144]:
(Index([u'A', u'B', u'C'], dtype='object'),
Index([u'a', u'c', u'b'], dtype='object'))
另一种形式,更容易用眼睛看:
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)
最佳答案
怎么样:
>>> s = df.stack()
>>> s[s % 3 == 0].index.tolist()
[('A', 'a'), ('B', 'c'), ('C', 'b')]
循序渐进,首先我们堆叠:
>>> s = df.stack()
>>> s
A a 0
b 10
c 20
B a 1
b 11
c 21
C a 2
b 12
c 22
dtype: int64
选择:
>>> s % 3 == 0
A a True
b False
c False
B a False
b False
c True
C a False
b True
c False
dtype: bool
使用此过滤系列:
>>> s[s % 3 == 0]
A a 0
B c 21
C b 12
dtype: int64
获取索引:
>>> s[s % 3 == 0].index
MultiIndex(levels=[[u'A', u'B', u'C'], [u'a', u'b', u'c']],
labels=[[0, 1, 2], [0, 2, 1]])
我们正在寻找的价值观:
>>> s[s % 3 == 0].index.tolist()
[('A', 'a'), ('B', 'c'), ('C', 'b')]
关于python - Pandas 反向搜索:获取行名和列名的有序列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21271375/