如果全部为零,则删除Pandas中的列

use*_*593 64 python pandas

我目前有一个由1和0作为值的列组成的数据帧,我想迭代列并删除仅由0组成的列.这是我到目前为止所尝试的:

ones = []
zeros = []
for year in years:
    for i in range(0,599):
        if year[str(i)].values.any() == 1:
            ones.append(i)
        if year[str(i)].values.all() == 0:
            zeros.append(i)
    for j in ones:
        if j in zeros:
            zeros.remove(j)
    for q in zeros:
        del year[str(q)]
Run Code Online (Sandbox Code Playgroud)

在哪些年份是我正在分析的不同年份的数据框列表,其中包含列中包含一个的列,而零是包含全零的列的列表.有没有更好的方法根据条件删除列?出于某种原因,我必须检查那些列是否也在零列表中,并从零列表中删除它们以获得所有零列的列表.

unu*_*tbu 156

df.loc[:, (df != 0).any(axis=0)]
Run Code Online (Sandbox Code Playgroud)

以下是它如何工作的细分:

In [74]: import pandas as pd

In [75]: df = pd.DataFrame([[1,0,0,0], [0,0,1,0]])

In [76]: df
Out[76]: 
   0  1  2  3
0  1  0  0  0
1  0  0  1  0

[2 rows x 4 columns]
Run Code Online (Sandbox Code Playgroud)

df != 0创建一个布尔数据帧,其中True df为非零值:

In [77]: df != 0
Out[77]: 
       0      1      2      3
0   True  False  False  False
1  False  False   True  False

[2 rows x 4 columns]
Run Code Online (Sandbox Code Playgroud)

(df != 0).any(axis=0)返回一个布尔系列,指示哪些列具有非零条目.(该any操作将沿0轴的值 - 即沿着行 - 聚合为单个布尔值.因此,每个列的结果是一个布尔值.)

In [78]: (df != 0).any(axis=0)
Out[78]: 
0     True
1    False
2     True
3    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)

而且df.loc可以用来选择那些列:

In [79]: df.loc[:, (df != 0).any(axis=0)]
Out[79]: 
   0  2
0  1  0
1  0  1

[2 rows x 2 columns]
Run Code Online (Sandbox Code Playgroud)

要"删除"零列,请重新分配df:

df = df.loc[:, (df != 0).any(axis=0)]
Run Code Online (Sandbox Code Playgroud)

  • 我认为,如果我们检查条件是否为真,则比检查条件是否为真更容易理解。我认为`(df == 0).all(axis = 0)`更直接。 (2认同)
  • 谢谢你的分解。这让事情变得非常清楚。 (2认同)

Jer*_*y Z 8

这是另一种使用方法是

df.replace(0,np.nan).dropna(axis=1,how="all")

与unutbu的解决方案相比,这种方式显然更慢:

%timeit df.loc[:, (df != 0).any(axis=0)]
652 µs ± 5.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df.replace(0,np.nan).dropna(axis=1,how="all")
1.75 ms ± 9.49 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Run Code Online (Sandbox Code Playgroud)