如何在Python中使用pandas满足特定条件后删除观测值
我使用的是pandas数据帧,我希望在满足条件(cond=1)后删除同名的观测值 我的数据集看起来像:如何在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
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
alambda
执行此操作,该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的观测值。我忘了提到这个选项。也可能是一个人只有零。在这种情况下,我不想放弃任何观察。非常感谢!那很有效!是否也可以添加更多列?我试图扩展此代码,但它不能处理超过两列的问题。如果您有新问题,请在接受此答案后发布新问题,增加/更改您的要求不是好做法如果我的答案解决了您的问题,您可以接受,则我的答案左上角将有一个空勾号,这就是为什么这个问题不会一直没有答案