2015-01-28 6 views
1

В кадре данных pandas, как удалить все строки с нулями после определенного столбца. НапримерУдалите все строки, содержащие все нули после определенного номера столбца

from pandas import DataFrame 
df = DataFrame({'a' : [0,1,1,0,0,0,0], 'b' : [0,1,-1, 1,0,0,0], 'c': [1,4,5,6,7,0,0]}).T 

ДФ:

0 1 2 3 4 5 6 
a 0 1 1 0 0 0 0 
b 0 1 -1 1 0 0 0 
c 1 4 5 6 7 0 0 

Как я бросаю строки, содержащие все значения как ноль после колонки 3? Первая и вторая строки (индекс a и b) в этом примере должны быть отброшены.

+0

@EdChum, моя ошибка. Я отредактировал OP – user1140126

ответ

2

Вы можете индексировать столбцы, заменить 0 с NaN, ронять строки, которые не имеют, по меньшей мере, 1 нон NaN значение и использовать loc по индексу:

In [63]: 
df.loc[df[df.columns[4:]].replace(0, NaN).dropna(thresh=1).index] 
Out[63]: 
    0 1 2 3 4 5 6 
c 1 4 5 6 7 0 0 

Так ломая это вниз:

In [64]: 
df[df.columns[4:]] 

Out[64]: 
    4 5 6 
a 0 0 0 
b 0 0 0 
c 7 0 0 

In [66]: 
df[df.columns[4:]].replace(0, NaN) 

Out[66]: 
    4 5 6 
a NaN NaN NaN 
b NaN NaN NaN 
c 7 NaN NaN 

In [67]:  
df[df.columns[4:]].replace(0, NaN).dropna(thresh=1) 

Out[67]: 
    4 5 6 
c 7 NaN NaN 

In [68]:  
df[df.columns[4:]].replace(0, NaN).dropna(thresh=1).index 

Out[68]: 
Index(['c'], dtype='object') 

Update На самом деле более краткий способ:

In [77]: 

df[any(df[df.columns[4:]] != 0, axis=1)] 
Out[77]: 
    0 1 2 3 4 5 6 
c 1 4 5 6 7 0 0 
2

В случае, если у вас есть произвольное количество столбцов, вы CNA всегда делают:

df[ df.ix[:, 4:].T.abs().sum() != 0 ] 
+0

. Это приводит к проблемам, если столбцы 4,5,6 содержат значения, которые суммируются с нулем, например '(0, 1, -1)'. – ojdo

+1

Thant's true. Я забыл абс! – ssm

Смежные вопросы