Python 从多索引数据帧中删除具有所有NaN值的项
我在与看起来像这样的数据帧争论时遇到了一些问题:Python 从多索引数据帧中删除具有所有NaN值的项,python,pandas,Python,Pandas,我在与看起来像这样的数据帧争论时遇到了一些问题: value year name 2015 bob 10.0 cat NaN 2016 bob NaN cat NaN 我想删除那些相同名称的所有值都是NaN的项目。在这种情况下,结果应为: value year name 2015
value
year name
2015 bob 10.0
cat NaN
2016 bob NaN
cat NaN
我想删除那些相同名称
的所有值都是NaN的项目。在这种情况下,结果应为:
value
year name
2015 bob 10.0
2016 bob NaN
所有cat
值均为NaN,因此cat
已消失。因为bob
有一个非NaN值,所以它会保持不变
请注意,输入中的2016
值均为NaN,但输出中仍然存在2016
——因为此规则仅适用于name
列。理想情况下,我希望能够提供这适用于哪个列作为参数
这可能吗?我该怎么做?如果要完成工作,需要重新编制索引/进行转置/做任何事情,我都可以。您可以使用unstack
,isnull
,all
和stack
:
df.unstack().loc[:,~df.unstack().isnull().all()].stack(-1, dropna=False)
或者使用notnull
和any
:
df.unstack().loc[:,df.unstack().notnull().any()].stack(-1, dropna=False)
输出:
value
year name
2015 bob 10.0
2016 bob NaN
你可以用
删除重复项是否会产生意外影响?e、 g.如果两个cat
s的值都是100
而不是NaN,它仍然会被删除,对吗?我只希望NaN值受到影响。当我在实际数据帧上使用它时,我得到一个{AttributeError}'DataFrame'对象没有属性'value'
。知道为什么吗?@spinningarrow值是列名。将其更改为您认为合适的列名。谢谢
value
year name
2015 bob 10.0
2016 bob NaN
df.groupby(level='name').filter(lambda x: x.value.notnull().any())
value
year name
2015 bob 10.0
2016 bob NaN