Удалить низкочастотные элементы из кадра данных панд - PullRequest
0 голосов
/ 03 ноября 2018

Я немного играю с Last.fm набором данных. Набор данных состоит из идентификатора пользователя, имени исполнителя и количества воспроизведений. как то так:

    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 и попытаться их посчитать. Но так как я немного новичок в пандах и мой набор данных очень большой, я хотел знать, как лучше всего удалять эти элементы.

ТЛ; др:
Каков наилучший способ удалить наиболее часто встречающихся художников?

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 голосов
/ 03 ноября 2018

проще всего попробовать, исходя из понимания из поста.

>>> 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
0 голосов
/ 03 ноября 2018

Я полагаю, что вам нужно 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...