Python pandas删除不满足多个条件的行

时间:2016-08-08 09:01:28

标签: python pandas dataframe

假设我有一个这样的数据框:

   id  num
0   1    1
1   2    2
2   3    1
3   4    2
4   1    1
5   2    2
6   3    1
7   4    2

出于测试目的,可以生成以上内容:

test = pd.DataFrame({'id': np.array([1,2,3,4] * 2,dtype='int32'),
                     'num': np.array([1,2] * 4,dtype='int32')
                    })

现在,我想只保留满足特定条件的行:id不是1而num不是1.本质上我想要删除索引为0和4的行。对于我的实际数据集,它更容易删除我不想要的行,而不是指定我想要的行

我试过这个:

test = test[(test['id'] != 1) & (test['num'] != 1)]

然而,这给了我这个:

   id  num
1   2    2
3   4    2
5   2    2
7   4    2

似乎删除了id为1或num为1

的所有行

我已经看过其他一些问题,答案是我上面使用过的那个问题,但在我的案例中似乎没有找到答案

1 个答案:

答案 0 :(得分:10)

如果将布尔条件更改为相等并通过将两者括在另外的括号中来反转组合布尔条件,那么您将获得所需的行为:

In [14]:    
test = test[~((test['id'] == 1) & (test['num'] == 1))]
test

Out[14]:
   id  num
1   2    2
2   3    1
3   4    2
5   2    2
6   3    1
7   4    2

我也认为你对布尔语法的理解不正确你想要的是or条件:

In [22]:
test = test[(test['id'] != 1) | (test['num'] != 1)]
test

Out[22]:
   id  num
1   2    2
2   3    1
3   4    2
5   2    2
6   3    1
7   4    2

如果您考虑这意味着什么,第一个条件排除了任何一行' id'等于1,类似于' num'柱:

In [24]:
test[test['id'] != 1]

Out[24]:
   id  num
1   2    2
2   3    1
3   4    2
5   2    2
6   3    1
7   4    2

In [25]:
test[test['num'] != 1]

Out[25]:
   id  num
1   2    2
3   4    2
5   2    2
7   4    2

所以你真的想要or|)上述条件