删除某个列号后面包含全零的所有行

时间:2015-01-28 20:42:50

标签: python pandas

在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

df:

    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列之后将包含所有值的行拖放为零?此示例中的第一行和第二行(索引ab)将被删除。

3 个答案:

答案 0 :(得分: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')

<强>更新 实际上更简洁:

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

答案 1 :(得分:2)

如果您有任意数量的列,您可以随时执行:

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

答案 2 :(得分:0)

df[(df[4] != 0) | (df[5] != 0) | (df[6] != 0)]