如何在python中基于多个条件计算列中的唯一行

如何在python中基于多个条件计算列中的唯一行,python,pandas,loops,unique,Python,Pandas,Loops,Unique,我有一个数据框,看起来是这样的:(处理有多重可能的字符变量,我只是简化了问题) 我只想用exclusif治疗保留ID,换句话说,保留只接受过一次治疗的ID,即使是多次。之后,我想对每次治疗的ID数求和。结果将是: ID Position Treatment --20AxECvv- 0 A --20AxECvv- -1 A --20AxECvv- -2

我有一个数据框,看起来是这样的:(处理有多重可能的字符变量,我只是简化了问题)

我只想用exclusif治疗保留ID,换句话说,保留只接受过一次治疗的ID,即使是多次。之后,我想对每次治疗的ID数求和。结果将是:

ID              Position            Treatment
--20AxECvv-         0           A
--20AxECvv-         -1          A
--20AxECvv-         -2          A
zZU7a@8jN           0           B
QUeSNEXmdB          0           C
QUeSNEXmdB          -1          C   
qu72Ql@h79          0           C
总数为:

A : 1 
B : 1
C : 2

我知道如何解决这个问题,可能是在循环中使用循环,但我是Python/panda的初学者,谢谢

您可以按ID分组,并根据条件“唯一行数==1”筛选行

df1 = df.loc[df.groupby('ID').Treatment.filter(lambda x: x.nunique()==1).index]
或者正如@Igor Raush所说

df1 = df.groupby('ID').filter(lambda g: g.Treatment.nunique() == 1)    

    ID          Position    Treatment
0   --20AxECvv-     0           A
1   --20AxECvv-     -1          A
2   --20AxECvv-     -2          A
5   zZU7a@8jN       0           B
6   QUeSNEXmdB      0           C
7   QUeSNEXmdB      -1          C
8   qu72Ql@h79      0           C
并获得唯一的计数

df1.groupby('Treatment').ID.nunique()

Treatment
A        1
B        1
C        2

如果在一个ID下进行多次处理,您希望保留哪一个?或者跳过索引:
df.groupby('ID').filter(lambda g:g.treatment.nunique()==1)
@IgorRaush,是的,这样更干净。谢谢:)非常感谢Vaishali和Igorraush,我知道如何才能只拥有所有第一个位置的子集(即:每个id的最小位置)。有时第一个位置可能是-2或-65。我想我必须插入一个最小值函数,但我不知道如何管理它。@Anna,你能详细说明一下吗?预期的产出是多少?
df1.groupby('Treatment').ID.nunique()

Treatment
A        1
B        1
C        2