如果我有一个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
。
答案 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})