我在争论一个看起来像这样的数据框时遇到了一些麻烦:
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
列。理想情况下,我希望能够提供适用于哪个列作为参数。
这甚至可能吗?我该怎么做?我可以使用重新索引/转置/无论如何完成工作(只有在必要时才这样做!)。
答案 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)
您可以使用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