代码之家  ›  专栏  ›  技术社区  ›  DocDriven

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

  •  1
  • DocDriven  · 技术社区  · 8 年前

    我有一个有几个列的数据框架[A,B,C,…,Z]。我想从数据框中删除所有行,这些行的属性是它们在列[b,c,…,z]中的值等于0(整数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()]
    

    我不能让它工作。我对索引器的条件没有太多经验。我想避免一个为每一列链接零测试的解决方案。我相信有一个更优雅的解决方案。

    谢谢!

    编辑: 这个解决方案适用于一个人工创建的数据帧,但是当我在我的df上使用它时,它失败了,因为我读取了csv。文件如下:

    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)
    

    第一个print语句表明帧是正确读取的,但第二个print语句给出了一个空的数据帧。怎么会这样?

    1 回复  |  直到 8 年前
        1
  •  3
  •   jezrael    8 年前

    使用 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]