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 に答える
1

aが同様に機能する場合に、実際にaが必要かどうかを検討する価値があるかもしれません。さらに、 を使用すると、次の場合とは異なり、指先で高速操作の全世界を利用できます。MultiIndexDataFrameDataFrameMultiIndex

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

この方法を使用すると、すべてのラベル付けと、関心のあるインデックスの値を保持できます。

余談ですが、最初にesを発見したときMultiIndex、スライスパン以来の最高のものだと思いました. pandasさまざまなタスクに定期的に使用した後、それらは のように動作し、 のように動作するため、しばしば障害になることがわかりましDataFrameIndex

于 2013-09-07T16:35:10.673 に答える