3

マルチ インデックス データフレームで dropna を呼び出した後、インデックス内のレベル メタデータが更新されていないように見えます。これはバグですか?

In [1]: import pandas

In [2]: print pandas.__version__
0.10.1

In [3]: df_multi = pandas.DataFrame(index=[[1, 2],['a', 'b',]], 
                                    data=[[float('nan'), 5], [6, 7]])

In [4]: print df_multi
      0  1
1 a NaN  5
2 b   6  7

In [5]: df_multi = df_multi.dropna(axis=0, how='any')

In [6]: print df_multi
     0  1
2 b  6  7

In [7]: print df_multi.index
MultiIndex
[(2, b)]

In [8]: print df_multi.index.levels
[Int64Index([1, 2], dtype=int64), Index([a, b], dtype=object)]

上記の MultiIndex には (2, b) しかありませんが、1 と 'a' が index.levels にあると報告されていることに注意してください。

私が持っている回避策は、次のように「クリーンな」マルチインデックスで再インデックスすることです:

In [10]: c_clean = pandas.MultiIndex.from_tuples(df_multi.index)

In [11]: df_multi = df_multi.reindex(c_clean)

In [12]: print df_multi
     0  1
2 b  6  7

In [13]: print df_multi.index.levels
[Int64Index([2], dtype=int64), Index([b], dtype=object)]

編集:

この問題は、.ix を使用したスライス中にも発生し、おそらく他のインデックス操作でも発生します。

4

1 に答える 1

1

これは、ここにアーカイブされている既知の状況です https://github.com/pydata/pandas/issues/2655

人々は現在、それに対処する方法を検討しています。

私の回避策は、を使用することです。これは、すべてではなく一部の軸のみを削除する可能性があるindex.get_level_values(level)ためです。ただし、マルチインデックスのいずれかのレベルの残りのすべての値が必要になる場合があります。dropna(how='all')

何らかの理由で の戻り値index.get_level_values(level)は正しいのに、index.levelsは更新されていません (速度の理由でコストがかかりすぎるのでしょうか?)。

于 2013-03-01T02:32:01.483 に答える