2017-05-15 29 views
2

我遇到了一些麻煩扯皮一個數據幀,看起來像這樣所有NaN值:掉落的物品與來自大熊貓多索引的數據幀

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

我想刪除的項目,所有的value S代表同樣的name是NaN。在這種情況下,結果應該是這樣的:

    value 
year  name 
2015  bob  10.0 
2016  bob  NaN 

所有cat值分別爲NaN所以cat走了。由於bob有一個非NaN值,因此它會停留。

請注意,2016的值在輸入中均爲NaN,但輸出中仍有2016 - 因爲此規則僅適用於name列。理想情況下,我希望能夠提供適用於哪個列作爲參數。

這甚至可能嗎?我應該怎麼做?我可以用reindexing/transposing /如果需要完成這項工作(只有當它是必要的時候)。

回答

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 
+0

當我在我的實際數據框中使用這個屬性時,我得到一個'{AttributeError}'DataFrame'對象沒有屬性'value'。任何想法爲什麼這可能是? – spinningarrow

+0

@spinningarrow值是列名稱。將其更改爲任何列名稱是 – piRSquared

+0

是合理的。謝謝! – spinningarrow

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 
+0

請問'drop_duplicates'產生意想不到的效果如何?例如如果兩個'cat's的值都是'100'而不是NaN,它仍然會被刪除?我只想讓NaN值受到影響。 – spinningarrow

1

您可以使用unstackisnullall,並stack

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