从pandas多索引数据框中删除包含所有NaN值的项目

时间:2017-05-15 16:09:15

标签: python pandas

我在争论一个看起来像这样的数据框时遇到了一些麻烦:

                    value
year        name
2015        bob     10.0
            cat     NaN
2016        bob     NaN
            cat     NaN

我想放弃那些同一value的所有name s都是NaN的项目。在这种情况下,结果应为:

                    value
year        name
2015        bob     10.0
2016        bob     NaN

所有cat值均为NaN,因此cat消失了。由于bob有一个非NaN值,因此它会保留。

请注意,2016值在输入中都是NaN,但2016仍然在输出中 - 因为此规则仅适用于name列。理想情况下,我希望能够提供适用于哪个列作为参数。

这甚至可能吗?我该怎么做?我可以使用重新索引/转置/无论如何完成工作(只有在必要时才这样做!)。

3 个答案:

答案 0 :(得分:2)

您可以使用groupby with filter

df.groupby(level='name').filter(lambda x: x.value.notnull().any())

           value
year name       
2015 bob    10.0
2016 bob     NaN

答案 1 :(得分:1)

In [208]: df.reset_index().sort_values('name').drop_duplicates(['value']).set_index(['year','name'])
Out[208]:
           value
year name
2015 bob    10.0
2016 bob     NaN

答案 2 :(得分:1)

您可以使用unstackisnullallstack

df.unstack().loc[:,~df.unstack().isnull().all()].stack(-1, dropna=False)

或使用notnullany

df.unstack().loc[:,df.unstack().notnull().any()].stack(-1, dropna=False)

输出:

              value
year name       
2015 bob    10.0
2016 bob     NaN