从熊猫数据框中删除低频项

时间:2018-11-03 11:59:17

标签: python pandas dataframe filter

我在玩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

2 个答案:

答案 0 :(得分:1)

我相信您需要boolean indexingGroupBy.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