我在玩Last.fm数据集。数据集由用户ID,艺术家名称和播放次数组成。像这样的东西:
user artist plays
0 00000c289a1829a808ac09c00daf10bc3c4e223b betty blowtorch 2137
1 00000c289a1829a808ac09c00daf10bc3c4e223b die Ärzte 1099
2 00000c289a1829a808ac09c00daf10bc3c4e223b melissa etheridge 897
3 00000c289a1829a808ac09c00daf10bc3c4e223b elvenking 717
4 00000c289a1829a808ac09c00daf10bc3c4e223b juliette & the licks 706
现在,我要做的就是稍微清理一下这些数据。由于许多名称不正确,因此我想删除所有用户播放少于50次的艺术家。
我想,我应该使用 groupby 并尝试计算它们。但是由于我对熊猫有点陌生,并且我的数据集很大,所以我想知道删除这些项目的最佳实践。
tl; dr:
删除出现率最低的歌手的最佳方法是什么?
PS (编辑):
所需的输出将是与输入具有相同架构的数据帧,而已播放的艺术家(所有用户的播放总数)少于一定数量。
PS2 : 例如,我有这个数据集:
df = pd.DataFrame({
'user': 3 * ('abc'),
'artist': 3 * ('metallica', 'coldplay', 'dfj'),
'plays': [100,24,0,48,135,10,62,38,2]
})
所以我们有这个数据框:
user artist plays
0 a metallica 100
1 a coldplay 24
2 a dfj 3
3 b metallica 48
4 b coldplay 135
5 b dfj 10
6 c metallica 62
7 c coldplay 38
8 c dfj 2
现在“ dfj” 总共只播放了15次。我想删除“ dfj”并返回如下内容:
user artist plays
0 a metallica 100
1 a coldplay 24
3 b metallica 48
4 b coldplay 135
6 c metallica 62
7 c coldplay 38
答案 0 :(得分:1)
我相信您需要boolean indexing
和GroupBy.transform
,以用于具有与原始DataFrame
相同大小的集合值的系列:
print (df.groupby('artist')['plays'].transform('sum'))
0 210
1 197
2 12
3 210
4 197
5 12
6 210
7 197
8 12
Name: plays, dtype: int64
df1 = df[df.groupby('artist')['plays'].transform('sum') > 50]
print (df1)
user artist plays
0 abcabcabc metallica 100
1 abcabcabc coldplay 24
3 abcabcabc metallica 48
4 abcabcabc coldplay 135
6 abcabcabc metallica 62
7 abcabcabc coldplay 38
答案 1 :(得分:0)
根据帖子的理解,最简单的尝试。
>>> df
user artist plays
0 00000c289a1829a808ac09c00daf10bc3c4e223b betty blowtorch 2137
1 00000c289a1829a808ac09c00daf10bc3c4e223b die Ärzte 1099
2 00000c289a1829a808ac09c00daf10bc3c4e223b melissa etheridge 897
3 00000c289a1829a808ac09c00daf10bc3c4e223b elvenking 717
4 00000c289a1829a808ac09c00daf10bc3c4e223b juliette & the licks 706
结果:
>>> df[(df['plays'] >897)]
user artist plays
0 00000c289a1829a808ac09c00daf10bc3c4e223b betty blowtorch 2137
1 00000c289a1829a808ac09c00daf10bc3c4e223b die Ärzte 1099