识别满足条件的数据帧的元素

时间:2013-09-07 10:57:42

标签: pandas

假设我有以下数据框:

df = pd.DataFrame({'A':[1,2,3,400], 'B':[100,2,3,4]})

我想找到每个大于50的元素的位置(按索引和列),即正确的输出是:

[(3,'A'), (0,'B')]

最狡猾的做法是什么?

3 个答案:

答案 0 :(得分:3)

你可以在这里使用stack,然后使用布尔掩码(对于那些超过50的值):

In [11]: s = df.stack()

In [12]: s
Out[12]:
0  A      1
   B    100
1  A      2
   B      2
2  A      3
   B      3
3  A    400
   B      4
dtype: int64

In [13]: s[s > 50]
Out[13]:
0  B    100
3  A    400
dtype: int64

In [14]: s[s > 50].index
Out[14]:
MultiIndex
[(0, u'B'), (3, u'A')]

如果您需要此列表:

In [15]: s[s > 50].index.tolist()
Out[15]: [(0, 'B'), (3, 'A')]

答案 1 :(得分:2)

与上面几乎相同,但没有创建任何中间变量:

>>> df[df>50].stack().index.tolist()
[(0L, 'B'), (3L, 'A')]

答案 2 :(得分:1)

可能值得考虑一下你是否需要 MultiIndex,其中DataFrame同样适用。此外,使用DataFrame,您可以轻而易举地享受快速操作的全局,MultiIndex并非如此:

In [44]: df = pd.DataFrame({'A':[1,2,3,400], 'B':[100,2,3,4]})

In [45]: df = df.reset_index()

In [46]: df
Out[46]:
   index    A    B
0      0    1  100
1      1    2    2
2      2    3    3
3      3  400    4

In [47]: molten = melt(df, var_name='column', id_vars='index')

In [48]: molten
Out[48]:
   index column  value
0      0      A      1
1      1      A      2
2      2      A      3
3      3      A    400
4      0      B    100
5      1      B      2
6      2      B      3
7      3      B      4

In [49]: molten[molten.value > 50]
Out[49]:
   index column  value
3      3      A    400
4      0      B    100

使用此方法,您可以保留所有标签以及您感兴趣的索引值。

作为旁注,当我第一次发现MultiIndex时,我认为它们是切片面包以来最棒的东西。在定期使用pandas执行各种任务后,我发现它们通常是一种障碍,因为它们的行为类似于DataFrame,有点像Index