假设我有以下数据框:
df = pd.DataFrame({'A':[1,2,3,400], 'B':[100,2,3,4]})
我想找到每个大于 50 的元素的位置(按索引和列),即正确的输出是:
[(3,'A'), (0,'B')]
这样做的最pythonic方式是什么?
假设我有以下数据框:
df = pd.DataFrame({'A':[1,2,3,400], 'B':[100,2,3,4]})
我想找到每个大于 50 的元素的位置(按索引和列),即正确的输出是:
[(3,'A'), (0,'B')]
这样做的最pythonic方式是什么?
您可以在此处使用堆栈,然后使用布尔掩码(对于超过 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')]
与上面几乎相同,但没有创建任何中间变量:
>>> df[df>50].stack().index.tolist()
[(0L, 'B'), (3L, 'A')]
可能值得考虑您是否真的需要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
使用这种方法,您可以保留所有标签和您感兴趣的索引值。
作为旁注,当我第一次发现MultiIndex
es 时,我认为它们是自切片面包以来最伟大的东西。在pandas
定期使用各种任务后,我发现它们通常是一个障碍,因为它们的行为有点像 aDataFrame
和有点像Index
.