python - Pandas:当组中的值包含相似值时,从数据中删除组
问题描述
df = pd.DataFrame({"name":["A", "A", "B" ,"B", "C", "C"],
"nickname":["X","Y","X","Z","Y", "Y"]})
如何按“名称”对 df 进行分组并删除仅包含“Y”的组?在我的情况下,应该删除“C”。
我正在使用下面的代码,但它不起作用:
df_new = df.groupby('name').filter(lambda x: all(x['nickname'] != 'Y'))
如果 Y 出现在具有其他昵称的任何其他“名称”中,则应保留该名称。请帮忙。
解决方案
这里groupby
没有必要。您可以使用boolean indexing
:
df = df[df['name'].isin(df.loc[df['nickname'].ne('Y'), 'name'].unique())]
print (df)
name nickname
0 A X
1 A Y
2 B X
3 B Z
解释:
首先比较ne
不相等的值:
print (df['nickname'].ne('Y'))
0 True
1 False
2 True
3 True
4 False
5 False
Name: nickname, dtype: bool
然后选择name
列布尔掩码:
print (df.loc[df['nickname'].ne('Y'), 'name'])
0 A
2 B
3 B
Name: name, dtype: object
为了获得更好的性能,获得独特的价值:
print(df.loc[df['nickname'].ne('Y'), 'name'].unique())
['A' 'B']
并过滤isin
最终掩码:
print (df['name'].isin(df.loc[df['nickname'].ne('Y'), 'name'].unique()))
0 True
1 True
2 True
3 True
4 False
5 False
Name: name, dtype: bool
性能:
取决于行数、唯一组数和匹配值数 - 在您的真实数据中进行最佳测试:
np.random.seed(123)
N = 100000
df = pd.DataFrame({'name': np.random.randint(1000,size=N).astype(str),
'nickname':np.random.randint(200,size=N).astype(str)})
#print (df)
In [152]: %timeit df[df.nickname.ne('Y').groupby(df.name).transform('sum').astype(bool)]
27.6 ms ± 292 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [153]: %timeit df[~df.nickname.eq('Y').groupby(df.name).transform('all')]
27.3 ms ± 162 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [154]: %timeit df[df['name'].isin(df.loc[df['nickname'].ne('Y'), 'name'].unique())]
28.9 ms ± 189 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [155]: %timeit df[~df.assign(mask=df.nickname.eq('Y')).groupby('name').mask.transform('all')]
30.3 ms ± 469 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [156]: %timeit df[df.groupby('name')['nickname'].transform('unique').astype(str) !="['Y']"]
15.6 s ± 233 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [157]: %timeit df.groupby('name').filter(lambda x: any(x['nickname'] != 'Y'))
408 ms ± 29.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
推荐阅读
- c# - 使用代理 - 底层连接已关闭:发送时发生意外错误
- microsoft-graph-api - team/{teamid}/installedApps 扩展为 teamsAppDefinition 显示不正确的版本
- php - 使用正则表达式验证用户输入以防止 sql 注入
- c - 将字符添加到用 c 中的字符串初始化的字符指针
- javascript - 从 Firebase 中检索数据并显示在单独的 div 中
- kubernetes - 监控 Kubernetes pod 健康事件
- c# - MemoryMappedFile 低完整性.Net 5
- php - 在php中单击链接时永久添加文本
- python - Python包:启动脚本时未加载样式表
- javascript - 如何使自定义网站无限滚动更改 URL?