2017-05-11 91 views
3

嗨,我想從我的熊貓數據框中移除行數小於3的非零值(不包括總列數)。在熊貓中刪除行數小於3的非零值

所以現在我有。

year 2001 2002 2003 2004 2005 2006 2007 TOTAL 
    player 
    Emma 0  0  0 0 3 4 5 12 
    Max  3  5  0 0 0 0 0 8 
    Josh 1  2  4 1 2 1 0 11 
    Steve 0  0  0 0 3 0 0 3 
    Mike 1  0  0 0 0 0 2 3 

但我想:

year 2001 2002 2003 2004 2005 2006 2007 TOTAL 
    player 
    Emma 0  0  0 0 3 4 5 12 
    Josh 1  2  4 1 2 1 0 11 

我想用一個for循環,但我不知道如何實現它/如果是去了解我的解決問題的最佳途徑。

回答

2

pandas
dropTOTAlsum和非零的每行的數

df[df.drop('TOTAL', 1).ne(0).sum(1).gt(2)] 

year 2001 2002 2003 2004 2005 2006 2007 TOTAL 
player             
Emma  0  0  0  0  3  4  5  12 
Josh  1  2  4  1  2  1  0  11 

numpy
更快溶液

v = df.values 
m = (v[:, :-1] != 0).sum(1) > 2 
pd.DataFrame(v[m], df.index[m], df.columns) 

year 2001 2002 2003 2004 2005 2006 2007 TOTAL 
player             
Emma  0  0  0  0  3  4  5  12 
Josh  1  2  4  1  2  1  0  11 
+1

謝謝隊友! df [df.ne(0).sum(1)> 3]工作了一段時間 – aoshea

+2

/粗體/斜體/引用在我的瀏覽器中有點侷促...我更喜歡粗體/斜體或者如果需要粗體/引用。但是工作上的領域... –

+1

@StephenRauch所以我很清楚...你告訴我,我使用大膽/斜體/ code_quote使你的眼睛流血。如果我想讓你繼續閱讀我的答案,我應該停下來。 – piRSquared

0

設置

df = pd.DataFrame({'2001': {'Emma': 0, 'Josh': 1, 'Max': 3, 'Mike': 1, 'Steve': 0}, 
'2002': {'Emma': 0, 'Josh': 2, 'Max': 5, 'Mike': 0, 'Steve': 0}, 
'2003': {'Emma': 0, 'Josh': 4, 'Max': 0, 'Mike': 0, 'Steve': 0}, 
'2004': {'Emma': 0, 'Josh': 1, 'Max': 0, 'Mike': 0, 'Steve': 0}, 
'2005': {'Emma': 3, 'Josh': 2, 'Max': 0, 'Mike': 0, 'Steve': 3}, 
'2006': {'Emma': 4, 'Josh': 1, 'Max': 0, 'Mike': 0, 'Steve': 0}, 
'2007': {'Emma': 5, 'Josh': 0, 'Max': 0, 'Mike': 2, 'Steve': 0}, 
'TOTAL': {'Emma': 12, 'Josh': 11, 'Max': 8, 'Mike': 3, 'Steve': 3}}) 

df.loc[np.sum(df.iloc[:,:-1]>0, axis=1)[lambda x: x>=3].index] 
    Out[889]: 
     2001 2002 2003 2004 2005 2006 2007 TOTAL 
Emma  0  0  0  0  3  4  5  12 
Josh  1  2  4  1  2  1  0  11 

替代地使用GROUPBY和過濾器:

df.groupby(level=0).filter(lambda x: np.sum(x.iloc[0,:]>0)>=4) 
Out[918]: 
     2001 2002 2003 2004 2005 2006 2007 TOTAL 
Emma  0  0  0  0  3  4  5  12 
Josh  1  2  4  1  2  1  0  11