如何在Python中使用pandas满足特定条件后删除观测值

如何在Python中使用pandas满足特定条件后删除观测值,python,pandas,Python,Pandas,我使用的是pandas数据帧,我希望在满足条件(cond=1)后删除同名的观测值 我的数据集看起来像: person cond A 0 A 0 A 1 A 0 A 0 B 0 B 1 C 1 C 0 我想得到这个: person cond A 0 A

我使用的是pandas数据帧,我希望在满足条件(cond=1)后删除同名的观测值

我的数据集看起来像:

person    cond
  A         0    
  A         0    
  A         1
  A         0
  A         0
  B         0 
  B         1
  C         1
  C         0
我想得到这个:

person    cond
  A         0    
  A         0
  A         1    
  B         0 
  B         1    
  C         1
我希望代码首先检查下一个人是否同名,然后检查条件是否满足(cond=1),如果满足,则删除下一行同名的所有行


有人能帮我吗

您可以使用
groupby
apply
a
lambda
执行此操作,该
lambda>使用
idxmax
从开始到第一个最大值对df进行切片,在这种情况下,它将是第一个
1
值:

In [16]:
df.groupby('person')['cond'].apply( lambda x: x.loc[:x.idxmax()]).reset_index()

Out[16]:
  person  level_1  cond
0      A        0     0
1      A        1     0
2      A        2     1
3      B        5     0
4      B        6     1
5      C        7     1
您还可以另外调用
drop
删除
'level_1'
列:

In [23]:
df.groupby('person')['cond'].apply( lambda x: x.loc[:x.idxmax()]).reset_index().drop('level_1', axis=1)

Out[23]:
  person  cond
0      A     0
1      A     0
2      A     1
3      B     0
4      B     1
5      C     1
更新

要处理组中没有
1
的情况,我们可以测试
lambda
中是否存在这种情况:

In [24]:
import pandas as pd
import io
# setup some data
t="""person    cond
  A         0    
  A         0    
  A         1
  A         0
  A         0
  B         0 
  B         1
  C         1
  C         0
  D         0
  D         0"""
df = pd.read_csv(io.StringIO(t), delim_whitespace=True)
df

Out[24]:
   person  cond
0       A     0
1       A     0
2       A     1
3       A     0
4       A     0
5       B     0
6       B     1
7       C     1
8       C     0
9       D     0
10      D     0

In [29]:
df.groupby('person')['cond'].apply( lambda x: x.loc[:x.idxmax()] if len(x[x==0]) != len(x) else x)

Out[29]:
person    
A       0     0
        1     0
        2     1
B       5     0
        6     1
C       7     1
D       9     0
        10    0
Name: cond, dtype: int64

因此,我们在这里测试是否所有值都是
0
,如果是,只需返回组,否则我们将像以前一样进行切片

我正要编写如何使用。使用多个COL进行复制,但这是更好的答案。感谢您的帮助!我试着用这个,但现在他也放弃了所有只有cond=0的观测值。我忘了提到这个选项。也可能是一个人只有零。在这种情况下,我不想放弃任何观察。非常感谢!那很有效!是否也可以添加更多列?我试图扩展此代码,但它不能处理超过两列的问题。如果您有新问题,请在接受此答案后发布新问题,增加/更改您的要求不是好做法如果我的答案解决了您的问题,您可以接受,则我的答案左上角将有一个空勾号,这就是为什么这个问题不会一直没有答案