Python 3.x 删除具有多个条件的行

Python 3.x 删除具有多个条件的行,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,考虑以下数据帧: df = pd.DataFrame({ 'case_id': [1050, 1050, 1050, 1050, 1051, 1051, 1051, 1051], 'elm_id': [101, 102, 101, 102, 101, 102, 101, 102], 'cid': [1, 1, 2, 2, 1, 1, 2, 2], 'fx': [736.1, 16.5, 98.8, 158.5, 272.5, 750.0, 333.4, 104.2

考虑以下数据帧:

df = pd.DataFrame({
    'case_id': [1050, 1050, 1050, 1050, 1051, 1051, 1051, 1051],
    'elm_id': [101, 102, 101, 102, 101, 102, 101, 102],
    'cid': [1, 1, 2, 2, 1, 1, 2, 2],
    'fx': [736.1, 16.5, 98.8, 158.5, 272.5, 750.0, 333.4, 104.2],
    'fy': [992.0, 261.3, 798.3, 452.0, 535.9, 838.8, 526.7, 119.4],
    'fz': [428.4, 611.0, 948.3, 523.9, 880.9, 340.3, 890.7, 422.1]})
打印时如下所示:

   case_id  cid  elm_id     fx     fy     fz
0     1050    1     101  736.1  992.0  428.4
1     1050    1     102   16.5  261.3  611.0
2     1050    2     101   98.8  798.3  948.3
3     1050    2     102  158.5  452.0  523.9
4     1051    1     101  272.5  535.9  880.9
5     1051    1     102  750.0  838.8  340.3
6     1051    2     101  333.4  526.7  890.7
7     1051    2     102  104.2  119.4  422.1
我需要删除‘case_id’=列表中的值和‘cid’=列表中的值的行。为了简单起见,让我们只使用具有单个值的列表:
cases=[1051]
ids=[1]
。在这个场景中,我希望新的数据帧有(6)行数据。它应该是这样的,因为有两行符合我的条件,应该删除:

   case_id  cid  elm_id     fx     fy     fz
0     1050    1     101  736.1  992.0  428.4
1     1050    1     102   16.5  261.3  611.0
2     1050    2     101   98.8  798.3  948.3
3     1050    2     102  158.5  452.0  523.9
4     1051    2     101  333.4  526.7  890.7
5     1051    2     102  104.2  119.4  422.1
我试过一些不同的方法,比如:

df2=df[(df.case\u id!=subcase)和(df.cid!=commit\u id)]

但这与我的预期相反:

2     1050    2     101   98.8  798.3  948.3
3     1050    2     102  158.5  452.0  523.9
我还尝试过使用
.query()
df.query('(case\u id!=1051)和(cid!=1)
但是得到了相同的(2)行结果


任何帮助和/或解释都将不胜感激。

您的代码将查找符合条件的行,而不是删除它。您可以使用 使用以下命令:

df.drop(df.loc[(df['case_id'].isin(cases)) & (df['cid'].isin(ids))].index)
输出:

     case_id    cid elm_id  fx  fy  fz
0   1050    1   101 736.1   992.0   428.4
1   1050    1   102 16.5    261.3   611.0
2   1050    2   101 98.8    798.3   948.3
3   1050    2   102 158.5   452.0   523.9
6   1051    2   101 333.4   526.7   890.7
7   1051    2   102 104.2   119.4   422.1

代码查找符合条件的行,而不是删除它。您可以使用 使用以下命令:

df.drop(df.loc[(df['case_id'].isin(cases)) & (df['cid'].isin(ids))].index)
输出:

     case_id    cid elm_id  fx  fy  fz
0   1050    1   101 736.1   992.0   428.4
1   1050    1   102 16.5    261.3   611.0
2   1050    2   101 98.8    798.3   948.3
3   1050    2   102 158.5   452.0   523.9
6   1051    2   101 333.4   526.7   890.7
7   1051    2   102 104.2   119.4   422.1

这是逻辑问题:您可以将
&
(and)替换为
|
(or)<代码>df[(df.case_id!=1051)|(df.cid!=1)]
df.query('(case_id!=1051)|(cid!=1)
@Xinlu你是对的。不过,这对我来说毫无意义。我想同时满足两个标准(和),而不是一个标准(或)。为什么这样做?实际上,您希望删除一些观察:
(不是(A和B))
,这相当于
((不是A)或(不是B))
。因此,
df.query('not(case_id==1051&cid==1)
将给出相同的结果。这是逻辑问题:您可以用
(or)替换
&
(and)<代码>df[(df.case_id!=1051)|(df.cid!=1)]
df.query('(case_id!=1051)|(cid!=1)
@Xinlu你是对的。不过,这对我来说毫无意义。我想同时满足两个标准(和),而不是一个标准(或)。为什么这样做?实际上,您希望删除一些观察:
(不是(A和B))
,这相当于
((不是A)或(不是B))
。因此,
df.query('not(case_id==1051&cid==1)
将给出相同的结果。这很接近,但还没有实现。为了让它工作,我需要删除(~)的两个实例。我们要删除列表中的值。(~)否定了这一点。如果你删除(~),我会接受正确的答案。这很接近,但还没有。为了让它工作,我需要删除(~)的两个实例。我们要删除列表中的值。(~)否定了这一点。如果你删除(~),我会接受正确的答案。