2013-09-22 64 views
1

我有一個數據集,我正在分組,然後嘗試刪除在特定列中沒有數據的任何組。例如:過濾掉所有NaN列的組

df = pd.DataFrame{'movie': ['thg', 'thg', 'mol', 'mol', 'lob', 'lob'], 
        'rating': [3., 4., 5., np.nan, np.nan, np.nan], 
        'name': ['John', np.nan, 'Terry', 'Graham', 'Eric', np.nan]} 
g = df.groupby('movie') 

    movie name rating 
0 thg John  3 
1 thg  NaN  4 
2 mol Terry  5 
3 mol Graham  NaN 
4 lob Eric  NaN 
5 lob  NaN  NaN 

我想從數據集中刪除組lob,因爲沒有人評分。我試過

mask = g['rating'].mean().isnull() 
g.filter(~mask) 

它給了我一個錯誤TypeError: 'Series' object is not callable。這是一種hackish的,所以我也試着

g.filter(lambda group: group.isnull().all()) 

這似乎更Python,但它給我的ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()錯誤。我如何過濾出一個組,爲什麼我會得到這些錯誤?任何關於groupby的其他信息通常也會有所幫助。我使用的是熊貓0.12.0,Python 2.7.5和Mac OS X 10.8.5。

+0

編輯:不要介意不重複,但這可能會有所幫助。 http://stackoverflow.com/questions/13413590/how-to-drop-rows-of-pandas-dataframe-whose-value-of-certain-column-is-nan – Shashank

回答

0

如果你要過濾的組,你可以這樣做:

g = df.groupby('movie').count() 
g = g[g['rating']>0] 

Out[14]: 
      movie name rating 
    movie   
    mol  2 2 1 
    thg  2 1 2 

或者你可以過濾DF先組

g = df[df['rating'].notnull()].groupby('movie').count() 

這將影響到最終的收視率:

Out[15]: 
     movie name rating 
movie   
mol  1 1 1 
thg  2 1 2 

所以mol有一個較低的電影和名稱計數與上述相比,但評分是相同的

+0

不幸的是,這只是過濾掉所有記錄NaN評級。我想過濾掉只有NaN評級的所有羣組。如果一個團體甚至有一個非NaN評級,我想保留整個團隊。 (並且最終將這些意思歸咎於這些NaN值。) –

+0

刪除NaN的頂級代碼意味着該組不會出現在組中,這與您想要的有何不同?或者你是否想要保持小組的總數,以便可以將這個意思進行歸納? – EdChum

+0

@TimLewandowski重新閱讀您的評論後,我不明白爲什麼第二個代碼片段不會做你想做的事情,因爲你將過濾掉所有有NaN評級的行。所以只要你對電影有一個評級,那麼它將在groupby操作中發揮作用。 – EdChum