如何从DataFrame中删除某些行仅包含零值的行

时间:2020-08-11 15:18:19

标签: python python-3.x pandas dataframe

我在Python中具有以下Pandas DataFrame:

import numpy as np
import pandas as pd
df  = pd.DataFrame(np.array([[1, 2, 3, 4, 5, 6], [11, 22, 33, 44, 55, 66], 
                             [111, 222, 0, 0, 0, 0], [1111, 0, 0, 0, 0, 0]]),
                   columns=['a', 'b', 'c', 'd', 'e', 'f'])

DataFrame在表中的外观如下:

    a      b     c    d     e    f
0   1      2     3    4     5    6
1   11     22    33   44    55   66
2   111    222   0    0     0    0
3   1111   2222  0    0     0    0

原始DataFrame比这大得多。如图所示,某些行(c,d,e,f)中的某些行具有零值。

我需要从DataFrame中删除这些列,以便我的新DataFrame如下所示(在删除仅给定列为零的行之后):

    a      b     c    d     e    f
0   1      2     3    4     5    6
1   11     22    33   44    55   66

我只需要删除所有这些列(c,d,e和f)均为零的行。例如,如果其中2个为0,那么我将不会删除此类行。

是否有一种很好的方法可以执行此操作而无需遍历DataFrame?

4 个答案:

答案 0 :(得分:1)

尝试一下

df[~df[list('cdef')].eq(0).all(axis = 1)]

    a   b   c   d   e   f
0   1   2   3   4   5   6
1  11  22  33  44  55  66

答案 1 :(得分:1)

在选定列上进行行过滤,任何列的any都为零:

import numpy as np
import pandas as pd

df  = pd.DataFrame(np.array([[1, 2, 3, 4, 5, 6], [11, 22, 33, 44, 55, 66],
                             [111, 222, 0, 0, 0, 0], [1111, 0, 0, 0, 0, 0]]),
                   columns=['a', 'b', 'c', 'd', 'e', 'f'])

df = df[(df[['c', 'd', 'e', 'f']] != 0).any(axis=1)]

print(df)

输出:

    a   b   c   d   e   f
0   1   2   3   4   5   6
1  11  22  33  44  55  66

答案 2 :(得分:1)

这里是另一个选择: 将df.query()与自定义查询一起使用。

my_query = '~('+'and '.join([f'{name}==0' for name in 'cdef'])+')'
df.query(my_query)

如果打印my_query,则很容易阅读: ~(c==0 and d==0 and e==0 and f==0) ~表示“不是”。

答案 3 :(得分:1)

与运算符

df.loc[~((((df['c'] == 0) & (df['d'] == 0)) & (df['e'] == 0)) & (df['f'] == 0))]