考虑这个pandas数据帧:
df = pd.DataFrame({'animal': ["dog", "dog", "dog", "cat", "snake", "dog", "snake", "cat", "goat", "bird"],
'label': [0, 0, 0, 1, 0, 1, 0, 1, 1, 1]})
我想删除标签与所有动物不匹配的全部条目。例如,dog被标记了三次"0",但第四次被标记为"1",所以我想删除所有dog条目。对于其他动物,它们都有相应的标签,因此我想保留其余的,这样剩下的数据帧将是:
df2 = pd.DataFrame({'Column1': ["cat", "snake", "snake", "cat", "goat", "bird"],
'label': [1, 0, 0, 1, 1, 1]})
感谢您的帮助。
我会使用transform
来获得每个组的一系列唯一值,并通过检查等于1来计算布尔掩码。
mask = df.groupby('animal')['label'].transform('nunique').eq(1)
result = df[mask]
详细信息:
>>> df.groupby('animal')['label'].transform('nunique')
0 2
1 2
2 2
3 1
4 1
5 2
6 1
7 1
8 1
9 1
Name: label, dtype: int64
>>> df.groupby('animal')['label'].transform('nunique').eq(1)
0 False
1 False
2 False
3 True
4 True
5 False
6 True
7 True
8 True
9 True
Name: label, dtype: bool
使用groupby
+transform('nunique')
来获取每个组的唯一值计数。
如果计数为1,则使用布尔索引保持行:
df2 = df[df.groupby('animal')['label'].transform('nunique').eq(1)]
输出:
animal label
3 cat 1
4 snake 0
6 snake 0
7 cat 1
8 goat 1
9 bird 1