我在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?
答案 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))]