Как отфильтровать числа (n> 3) в списке DataFrame? - PullRequest
0 голосов
/ 28 января 2019
movie_id    user_id      rating
0   1   [5, 2, 1, 6]    [4, 4, 5, 4]
1   2   [5, 1]          [3, 3]
2   3   [1]             [4]
3   4   [1]             [3]
4   5   [1]             [3]
5   6   [1]             [5]
6   7   [6, 1]          [2, 4]
7   8   [1, 6]          [1, 4]
8   9   [1, 6]          [5, 4]

Я пытаюсь получить количество чисел в «рейтинге», которые больше 3 для каждой строки.Например, [4, 4, 5, 5] => 4 / [3, 3] => 0.

Вот что я сделал до сих пор:

appr = df.copy()

appr['approval'] = appr['rating'].map(Counter)
appr

Ион выводит:

    movie_id    user_id   rating        approval
0   1        [5, 2, 1, 6][4, 4, 5, 4]   {4: 3, 5: 1}
1   2        [5, 1]      [3, 3]         {3: 2}
2   3        [1]         [4]            {4: 1}
3   4        [1]         [3]            {3: 1}
4   5        [1]         [3]            {3: 1}
5   6        [1]         [5]            {5: 1}
6   7        [6, 1]      [2, 4]         {2: 1, 4: 1}
7   8        [1, 6]      [1, 4]         {1: 1, 4: 1}
8   9        [1, 6]      [5, 4]         {5: 1, 4: 1}

Моя цель состоит в том, чтобы отфильтровать числа, которые не превышают 3 в рейтинге, для каждой строки и суммировать их появление:

    movie_id    user_id   rating        approval       appr_sum
0   1        [5, 2, 1, 6][4, 4, 5, 4]   {4: 3, 5: 1}   4
1   2        [5, 1]      [3, 3]         {3: 2}         0
2   3        [1]         [4]            {4: 1}         1
3   4        [1]         [3]            {3: 1}         0
4   5        [1]         [3]            {3: 1}         0
5   6        [1]         [5]            {5: 1}         1
6   7        [6, 1]      [2, 4]         {2: 1, 4: 1}   1
7   8        [1, 6]      [1, 4]         {1: 1, 4: 1}   1
8   9        [1, 6]      [5, 4]         {5: 1, 4: 1}   2

I 'мы попробовали:

s = appr['rating'].map

t = [x for x in s if x > 3]
t

Но есть TypeError: объект 'method' не повторяется, и если эта часть кода получилась правильной, это не суммирует их появление.

Ответы [ 4 ]

0 голосов
/ 28 января 2019

Вы также можете использовать метод apply в столбце оценок:

appr['appr_sum'] = \
appr['rating'].apply(lambda ratings: len([x for x in ratings if x > 3]))
print(appr)

 movie_id       user_id        rating  count
0        1  [5, 2, 1, 6]  [4, 4, 5, 4]      4
1        2        [5, 1]        [3, 3]      0
2        3           [1]           [4]      1
3        4           [1]           [3]      0
4        5           [1]           [3]      0
5        6           [1]           [5]      1
6        7        [6, 1]        [2, 4]      1
7        8        [1, 6]        [1, 4]      1
8        9        [1, 6]        [5, 4]      2
0 голосов
/ 28 января 2019

Причина, по которой ваше выражение не сработало, заключается в том, что вы неправильно выполняли серию панд.Более простой способ сделать эту работу:

import pandas as pd

df = pd.DataFrame({'A': [1, 3, 4]})

a = [x for _, x in df.iterrows() if x['A'] > 3]
print(a)

> [A]
  [4]
0 голосов
/ 28 января 2019

Лучшая идея - избегать списков в серии.Вместо этого:

  1. Разверните вашу серию списков в дополнительные столбцы.
  2. Разверните вашу серию списков в несколько строк.

Обе эти опции включают векторизациювычисления.Выбираем первый вариант:

rats = pd.DataFrame(df.pop('rating').values.tolist()).add_suffix('rat')
appr = appr.join(rats).assign(appr_sum=rats.gt(3).sum(1))
0 голосов
/ 28 января 2019

Использовать понимание вложенного списка с фильтрацией и sum:

appr['appr_sum'] = [sum(v for k, v in x.items() if k > 3) for x in appr['approval']]
print (appr)
   movie_id       user_id        rating      approval  appr_sum
0         1  [5, 2, 1, 6]  [4, 4, 5, 4]  {4: 3, 5: 1}         4
1         2        [5, 1]        [3, 3]        {3: 2}         0
2         3           [1]           [4]        {4: 1}         1
3         4           [1]           [3]        {3: 1}         0
4         5           [1]           [3]        {3: 1}         0
5         6           [1]           [5]        {5: 1}         1
6         7        [6, 1]        [2, 4]  {2: 1, 4: 1}         1
7         8        [1, 6]        [1, 4]  {1: 1, 4: 1}         1
8         9        [1, 6]        [5, 4]  {5: 1, 4: 1}         2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...