如何找出全部用零填充的行或列并在中删除它们1.数据帧在python中?

2022-09-28 21:43:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的pandas.DataFrame()对象:

In [11]: df
Out[11]: 
   a  b
0  0  1
1  0  1
2  0  0
3  0  0
4  1  1

[5 rows x 2 columns]

我想删除所有用零填充的行:这里是索引为2和3的行。你知道吗

期望输出:

In [12]: magic_func(df)
Out[12]: 
   a  b
0  0  1
1  0  1
4  1  1

[3 rows x 2 columns]

Tags: columns对象indataframepandasdfmagicoutrowsfunc
1条回答
网友
1楼 ·
df.loc[~(df == 0).all(axis=1)]

演示:

In [92]: df = pd.DataFrame({'a':[0,0,0,0,1], 'b':[1,1,0,0,1]})

In [93]: df
Out[93]: 
   a  b
0  0  1
1  0  1
2  0  0
3  0  0
4  1  1

[5 rows x 2 columns]

In [94]: (df == 0).all(axis=1)
Out[94]: 
0    False
1    False
2     True
3     True
4    False
dtype: bool

In [95]: df.loc[~(df == 0).all(axis=1)]
Out[95]: 
   a  b
0  0  1
1  0  1
4  1  1

[3 rows x 2 columns]

df[~df.isin([0]).all(axis=1)]同样有效:

In [108]: df[~df.isin([0]).all(axis=1)]
Out[108]: 
   a  b
0  0  1
1  0  1
4  1  1

但对于大型数据帧来说,速度可能较慢:

In [106]: df2 = pd.concat([df]*10000)

In [109]: %timeit df2.loc[~(df2 == 0).all(axis=1)]
100 loops, best of 3: 5.19 ms per loop

In [110]: %timeit df2[~df2.isin([0]).all(axis=1)]
10 loops, best of 3: 50.2 ms per loop

isin在需要针对一组大的值测试成员身份时非常有用,但是对于一个值来说,它并不奇怪df == 0更直接,速度更快。你知道吗