【问题标题】:Removing rows in Pandas based on multiple columns基于多列删除 Pandas 中的行
【发布时间】:2016-09-05 04:13:12
【问题描述】:

在 Pandas 中,我有一个包含 ZipCode、Age 和一堆列的数据框,这些列的值都应该为 1 或 0,即:

ZipCode Age A B C D

12345   21  0 1 1 1
12345   22  1 0 1 4
23456   45  1 0 1 1
23456   21  3 1 0 0

我想删除 A、B、C 或 D 列中未出现 0 或 1 的所有行,以清理数据。在这种情况下,我将删除第 2 行和第 4 行,因为 4 出现在第 2 行的 D 列中,3 出现在第 4 行的 A 列中。即使我有 100 列要检查,我也想这样做必须在我的条件语句中一一查找每一列。我该怎么做?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    其他两种解决方案效果很好,但如果您对速度感兴趣,您应该查看 numpy in1d 函数:

    data=df.loc[:, 'A':]
    
    In [72]:  df[np.in1d(data.values,[0,1]).reshape(data.shape).all(axis=1)]
    Out[72]:
       ZipCode  Age  A  B  C  D
    0    12345   21  0  1  1  1
    2    23456   45  1  0  1  1
    

    时机:

    In [73]: %timeit data=df.loc[:, 'A':]; df[np.in1d(data.values,[0,1]).reshape(data.shape).all(axis=1)]
    1000 loops, best of 3: 558 us per loop
    
    In [74]: %timeit df[df.ix[:,'A':].isin([0,1]).all(axis=1)]
    1000 loops, best of 3: 843 us per loop
    
    In [75]: %timeit df[df[['A','B','C','D']].isin([0,1]).sum(axis=1)==4]
    1000 loops, best of 3: 1.44 ms per loop
    

    【讨论】:

      【解决方案2】:

      您可以选择矢量化解决方案:

      In [64]: df[df[['A','B','C','D']].isin([0,1]).sum(axis=1)==4]
      
      Out[64]:
         ZipCode  Age  A  B  C  D
      0    12345   21  0  1  1  1
      2    23456   45  1  0  1  1
      

      【讨论】:

        【解决方案3】:

        使用isin 测试成员资格,使用all 测试所有行值是否为True,并使用此布尔掩码过滤df:

        In [12]:
        df[df.ix[:,'A':].isin([0,1]).all(axis=1)]
        
        Out[12]:
           ZipCode  Age  A  B  C  D
        0    12345   21  0  1  1  1
        2    23456   45  1  0  1  1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-18
          • 2021-05-13
          • 1970-01-01
          • 1970-01-01
          • 2018-10-17
          • 2020-11-26
          相关资源
          最近更新 更多