如何用Pandas Groupby筛选拥有多个专辑的艺术家对应数据行
问题原因分析
你之前的代码存在两个核心错误:
- 列名不匹配:你给出的示例DataFrame中艺术家列的列名是
Artist,不是代码中使用的ArtistId,直接运行会报字段不存在的错误 - 分组逻辑错误:你按
['Artist', 'AlbumId']两个维度分组,每个分组对应的是同一个艺术家的同一张专辑的所有曲目,每个分组内AlbumId的唯一值必然为1,所以filter的判断条件永远为假,最终返回的结果不符合预期。
正确实现方法
以下是两种常用的可行实现:
方法1:groupby + filter(逻辑最直观)
仅按艺术家单维度分组,判断每个艺术家的唯一专辑数是否大于1即可:
# 基于你给出的示例df的实现代码 result = df.groupby('Artist').filter(lambda x: x['AlbumId'].nunique() > 1)
方法2:布尔索引 + isin(大数据量下性能更高)
先统计符合条件的艺术家名单,再直接筛选所有属于这些艺术家的行,避免逐组计算的开销:
# 第一步:筛选出拥有超过1张专辑的艺术家名单 qualified_artists = df.groupby('Artist')['AlbumId'].nunique()[lambda x: x>1].index # 第二步:直接提取这些艺术家对应的所有行 result = df[df['Artist'].isin(qualified_artists)]
两种方法输出结果完全一致,针对示例数据的返回结果如下:
| Artist | AlbumId | TrackId |
|---|---|---|
| A | 201 | 1022 |
| A | 201 | 3472 |
| A | 451 | 9866 |
| C | 272 | 3411 |
| C | 272 | 8673 |
| C | 698 | 2543 |
| C | 698 | 5837 |
内容的提问来源于stack exchange,提问作者user17533599
相关产品推荐
相关产品推荐

