如何根据python中的多个条件计算列中的唯一行

Posted

技术标签:

【中文标题】如何根据python中的多个条件计算列中的唯一行【英文标题】:How to count unique rows in a column based on multiple conditions in python 【发布时间】:2018-01-27 09:01:48 【问题描述】:

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

ID              Position            Treatment
--20AxECvv-         0           A
--20AxECvv-         -1          A
--20AxECvv-         -2          A
--h9INKewQf-        0           A
--h9INKewQf-        -1          B
zZU7a@8jN           0           B
QUeSNEXmdB          0           C
QUeSNEXmdB          -1          C
qu72Ql@h79          0           C

我只想保留经过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】:

您可以按 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

【讨论】:

或者跳过索引:df.groupby('ID').filter(lambda g: g.Treatment.nunique() == 1) @IgorRaush,是的,这样更干净。谢谢:) 非常感谢 Vaishali 和 IgorRaush 并且知道我该怎么做才能只拥有所有第一个位置的子集(即:每个 id 的最小位置)。有时第一个位置可能是 -2 或 -65。我想我必须插入一个函数最小值,但我不知道如何管理它。 @Anna,你能详细说明一下吗?预期的输出是什么?

以上是关于如何根据python中的多个条件计算列中的唯一行的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas根据多个其他列中的条件替换一列中的值[重复]

如何根据附加条件计算列中的价格?

根据“如果单元格中的字符串”条件删除熊猫列中的行

为dataframe python列中的每个唯一值创建excel工作表

是否需要根据表中的唯一值将列分解为多个列?

根据单个列中的多个条件选择多个列