在pandas DataFrame上调用dropna()后应该更新多索引级别吗?

时间:2013-02-27 20:08:25

标签: python pandas multi-index

在多索引数据框上调用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进行切片时也会出现此问题,并且可能还会使用其他索引操作。

1 个答案:

答案 0 :(得分:1)

这是一个已知的位置归档 https://github.com/pydata/pandas/issues/2655

人们正在考虑如何处理它。

我的解决方法是使用index.get_level_values(level),因为dropna(how='all')可能只删除某些轴但不是全部,但我可能需要其中一个级别的所有剩余值索引。

由于某些原因,index.get_level_values(level)的返回是正确的,而index.levels尚未更新(可能因速度原因而过于昂贵?)。