2016-11-04 6 views
1

に存在する場合、私は、次のデータフレーム持っているパンダのデータフレームの列を削除します。私は何をしたいかゼロ以上のK行

A B C D id 
0 -14 -103 -101 0 a 
1 -90 0 0 0 b 
2 -90 -110 -110 0 c 
3 -96 -114 0 0 d 
4 -91 -114 0 0 e 

を実行することです:それはこのようになります

import pandas as pd 
df = pd.DataFrame({'id':['a','b','c','d','e'], 
        'A':[-14,-90,-90,-96,-91], 
        'B':[-103,0,-110,-114,-114], 
        'D':[0,0,0,0,0], 
        'C':[-101,0,-110,0,0]}) 

を2つ以上の行に0がある場合、列を削除する操作。それをどうすれば実現できますか?

最後に、この列のデータフレームがあります:A、B、id。

答えて

3

あなたがマスクにanycumsumを使用することができ、その後、ビット列で選択するためのboolean indexingを変更:マスクの

mask = ((df == 0).cumsum() > 1).any() 
print (mask) 
A  False 
B  False 
C  True 
id False 
dtype: bool 

print (df.ix[:, ~mask]) 
    A B id 
0 -14 -103 a 
1 -90 0 b 
2 -90 -110 c 
3 -96 -114 d 
4 -91 -114 e 

説明:

print (df == 0) 
     A  B  C  id 
0 False False False False 
1 False True True False 
2 False False False False 
3 False False True False 
4 False False True False 

print ((df == 0).cumsum()) 
    A B C id 
0 0 0 0 0 
1 0 1 1 0 
2 0 1 1 0 
3 0 1 2 0 
4 0 1 3 0 

print ((df == 0).cumsum() > 1) 
     A  B  C  id 
0 False False False False 
1 False False False False 
2 False False False False 
3 False False False False 
4 False False True False 

コメントによって編集 - マスクの必要性all

mask = (df == 0).all() 
print (mask) 
A  False 
B  False 
C  False 
D  True 
id False 
dtype: bool 

print (df.ix[:, ~mask]) 
    A B C id 
0 -14 -103 -101 a 
1 -90 0 0 b 
2 -90 -110 -110 c 
3 -96 -114 0 d 
4 -91 -114 0 e 
+0

ありがとうございました。 *すべての行がゼロの場合、列を削除したいのですか? – neversaint

+1

列 'D'または列' C'と 'D'だけを削除する必要がありますか? – jezrael

+0

@ jezreal:最後のリクエストでは 'D'だけです。 – neversaint

関連する問題