基于多列删除Pandas中的行

时间:2016-05-10 09:19:10

标签: python pandas

在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行的第4行。我想这样做即使我有100列要检查我不这样做我必须在条件语句中逐一查找每一列。我该怎么做?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

其他两种解决方案效果很好,但如果你对速度感兴趣,你应该看看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