假设我有以下数据框:
df = pd.DataFrame({'A':[1,2,3,400], 'B':[100,2,3,4]})
我想找到每个大于50的元素的位置(按索引和列),即正确的输出是:
[(3,'A'), (0,'B')]
最狡猾的做法是什么?
答案 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
。