根据条件从熊猫数据框中删除特定的行

时间:2018-07-26 13:13:34

标签: python pandas indexing

我有一个包含几列[A,B,C,...,Z]的数据框。我想从数据框中删除所有具有以下属性的行:[B,C,...,Z]列中的值等于0(整数零)。

示例df:

  A B C ... Z
0 3 0 0 ... 0 
1 1 0 0 ... 0
2 2 1 2 ... 3    <-- keep only this as it has values other than zero

我试图这样做:

df = df[(df.columns[1:] != 0).all()]

我无法正常工作。我对索引器的条件不太了解。我想避免一种解决方案,该解决方案对每列都进行零测试。我敢肯定,有一个更优雅的解决方案。

谢谢!

编辑: 该解决方案适用于人工创建的数据帧,但是当我在读取CSV的df上使用它时,它失败了。该文件如下所示:

A;B;C;D;E;F;G;H;I;J;K;L;M;N;O;P;Q;R;S;T;U;V;W;X;Y;Z
0;25310;169;81;0;0;0;12291181;31442;246;0;0;0;0;0;0;0;0;0;251;31696;0;0;329;0;0
1;6252727;20480;82;0;0;0;31088;85;245;0;0;0;0;0;0;0;0;0;20567;331;0;0;329;0;0
2;6032184;10961;82;0;0;0;31024;84;245;0;0;0;0;0;0;0;0;0;11046;330;0;0;329;0;0
3;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
4;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
5;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
6;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
7;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
8;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
9;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
10;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0

我使用以下命令阅读它:

import pandas as pd

# retrieve csv file as dataframe
df = pd.read_csv('PATH/TO/FILE'), 
                 decimal=',', 
                 sep=';')    

df[list(df)] = df[list(df)].astype('int') 

print(df)

df = df[(df.iloc[:, 1:] != 0).all(axis=1)]

print(df)

第一个打印语句表明该帧已正确读取,但是第二个打印语句却给了我一个空的数据框。怎么会这样?

1 个答案:

答案 0 :(得分:3)

使用iloc来选择所有列,而无需第一列:

df = df[(df.iloc[:, 1:] != 0).all(axis=1)]
print (df)
   A  B  C  Z
2  2  1  2  3

编辑:

df = df[(df.iloc[:, 1:] != 0).any(axis=1)]
print (df)
   A        B      C   D  E  F  G         H      I    J ...  Q  R  S      T  \
0  0    25310    169  81  0  0  0  12291181  31442  246 ...  0  0  0    251   
1  1  6252727  20480  82  0  0  0     31088     85  245 ...  0  0  0  20567   
2  2  6032184  10961  82  0  0  0     31024     84  245 ...  0  0  0  11046   

       U  V  W    X  Y  Z  
0  31696  0  0  329  0  0  
1    331  0  0  329  0  0  
2    330  0  0  329  0  0  

[3 rows x 26 columns]