【问题标题】:Remove low frequency items from pandas dataframe从 pandas 数据框中删除低频项
【发布时间】:2019-04-07 10:29:47
【问题描述】:

我在玩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 并尝试计算它们。但由于我对 pandas 有点陌生,而且我的数据集非常大,所以我想知道删除这些项目的最佳做法是什么。

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

【问题讨论】:

  • 您的 groupby 和 count 花费了多少时间?
  • @experiment 在这个数据集上不需要太多时间,也许两分钟。我只是想知道最佳实践,因为我稍后会处理更大的数据。
  • @AmirAghdam,根据您的帖子,期望的输出是什么?
  • @jezrael 现在怎么样? :)

标签: python pandas dataframe filter


【解决方案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

【讨论】:

    【解决方案2】:

    最简单的尝试,基于帖子的理解。

    >>> 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      相关资源
      最近更新 更多