如何解决如何从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],[1111,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?
解决方法
尝试一下
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
,
在选定列上进行行过滤,任何列的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],[1111,0]]),columns=['a','b','c','d','e','f'])
df = df[(df[['c','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
,
这里是另一个选择:
将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)
~
表示“不是”。
与运算符
df.loc[~((((df['c'] == 0) & (df['d'] == 0)) & (df['e'] == 0)) & (df['f'] == 0))]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。