1

假设我有以下数据框:

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

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

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

这样做的最pythonic方式是什么?

4

3 回答 3

3

您可以在此处使用堆栈,然后使用布尔掩码(对于超过 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')]
于 2013-09-07T11:53:50.710 回答
2

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

>>> df[df>50].stack().index.tolist()
[(0L, 'B'), (3L, 'A')]
于 2013-09-07T13:07:31.740 回答
1

可能值得考虑您是否真的需要aMultiIndex在这里, aDataFrame也可以工作。此外,通过 a ,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

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

作为旁注,当我第一次发现MultiIndexes 时,我认为它们是自切片面包以来最伟大的东西。在pandas定期使用各种任务后,我发现它们通常是一个障碍,因为它们的行为有点像 aDataFrame和有点像Index.

于 2013-09-07T16:35:10.673 回答