布尔列上的条件DataFrame过滤器?

时间:2018-09-11 21:23:40

标签: python pandas numpy pandas-groupby

如果我有一个DataFrame:

| id     | attribute_1 | attribute_2 |
|--------|-------------|-------------|
| 123abc | TRUE        | TRUE        |
| 123abc | TRUE        | FALSE       |
| 456def | TRUE        | FALSE       |
| 789ghi | TRUE        | TRUE        |
| 789ghi | FALSE       | FALSE       |
| 789ghi | FALSE       | FALSE       |

如何应用groupby或等效过滤器来计算如下所示的DataFrame子集中的id元素的唯一数量:

| id     | attribute_1 | attribute_2 |
|--------|-------------|-------------|
| 123abc | TRUE        | TRUE        |
| 123abc | TRUE        | FALSE       |

意思是,我想获得id值的唯一数量,其中attribute_1 == True 对于给定id 的所有实例,但attribute_2必须至少有1个True

因此,456def将不会包含在过滤器中,因为它对于True至少没有一个attribute_2

789ghi不会包含在过滤器中,因为它的所有attribute_1条目都不是True

1 个答案:

答案 0 :(得分:2)

您需要两次groupby,一次是在“ attribute_1”上使用transform('all'),第二次是在“ attribute_2”上使用transform('any')

i = df[df.groupby('id').attribute_1.transform('all')]
j = i[i.groupby('id').attribute_2.transform('any')]

print (j)
       id  attribute_1  attribute_2
0  123abc         True         True
1  123abc         True        False

最后,要获取满足此条件的唯一ID,请调用nunique

print (j['id'].nunique())
1

当您的attribute_ *列为布尔值时,这最容易做到。如果它们是字符串,请先修复它们:

df = df.replace({'TRUE': True, 'FALSE': False})