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

熊猫:如何通过选择列的范围来筛选行?

  •  1
  • SaadH  · 技术社区  · 4 年前

    我有以下数据框:

        name  c1 c2 c3 c4 c5 c6 c7 c8 
        ---   -- -- -- -- -- -- -- --
    0   img1  0  1  1  0  0  0  1  0
    1   img2  1  0  0  0  0  0  1  1
    2   img3  1  0  0  1  0  1  0  0
    ...
    

    我想选择列范围c2到c6中至少有一个非零值(即1)的行。结果数据帧应排除第二行(img2…)。

    我可以通过在以下条件下分别提及每一列来解决此问题:

    df = df[((df['c2']==1) | (df['c3']==1) ... | (df['c6']==1))]
    

    有没有其他更简洁的方法来实现相同的目标而不提及每一列(可能基于列的位置范围)?

    2 回复  |  直到 4 年前
        1
  •  1
  •   oppressionslayer    4 年前

    你可以这样做:

    df[df.ix[:,2:7].eq(1).any(axis=1)].ix[:,2:7] 
    

    输出(由于所有0而缺少行1):

       c2  c3  c4  c5  c6
    0   1   1   0   0   0
    2   0   0   1   0   1
    

    要显示所有列:

    df[df.ix[:,2:7].eq(1).any(axis=1)] 
    

    输出:

       name  c1  c2  c3  c4  c5  c6  c7  c8
    0  img1   0   1   1   0   0   0   1   0
    2  img3   1   0   0   1   0   1   0   0
    
        2
  •  2
  •   9mat    4 年前
    # test data
    from io import StringIO
    data = StringIO('''name,c1,c2,c3,c4,c5,c6,c7,c8
    img1,0,1,1,0,0,0,1,0
    img2,1,0,0,0,0,0,1,1
    img3,1,0,0,1,0,1,0,0''')
    
    import pandas as pd
    df = pd.read_csv(data)
    
    
    # list of columns to be used
    
    # select using column name
    # cols = ['c{}'.format(i) for i in range(2,7)]
    
    # select using column number
    cols = df.columns[2:7]
    
    # select if any col is 1
    df = df[(df[cols]==1).any(axis=1)]
    
    
    
    print(df)
    
       name  c1  c2  c3  c4  c5  c6  c7  c8
    0  img1   0   1   1   0   0   0   1   0
    2  img3   1   0   0   1   0   1   0   0